Skip to content

Commit

Permalink
bump to nightly-2023-02-26-03
Browse files Browse the repository at this point in the history
  • Loading branch information
leanprover-community-bot committed Feb 26, 2023
1 parent 1399d37 commit 9cb5deb
Show file tree
Hide file tree
Showing 15 changed files with 445 additions and 45 deletions.
2 changes: 2 additions & 0 deletions Mathbin/All.lean
Expand Up @@ -592,6 +592,7 @@ import Mathbin.Analysis.Convex.Uniform
import Mathbin.Analysis.Convolution
import Mathbin.Analysis.Fourier.AddCircle
import Mathbin.Analysis.Fourier.FourierTransform
import Mathbin.Analysis.Fourier.PoissonSummation
import Mathbin.Analysis.Fourier.RiemannLebesgueLemma
import Mathbin.Analysis.Hofer
import Mathbin.Analysis.InnerProductSpace.Adjoint
Expand Down Expand Up @@ -2239,6 +2240,7 @@ import Mathbin.NumberTheory.Padics.PadicNumbers
import Mathbin.NumberTheory.Padics.PadicVal
import Mathbin.NumberTheory.Padics.RingHoms
import Mathbin.NumberTheory.Pell
import Mathbin.NumberTheory.PellGeneral
import Mathbin.NumberTheory.PrimeCounting
import Mathbin.NumberTheory.PrimesCongruentOne
import Mathbin.NumberTheory.Primorial
Expand Down
7 changes: 5 additions & 2 deletions Mathbin/Analysis/Fourier/FourierTransform.lean
Expand Up @@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: David Loeffler
! This file was ported from Lean 3 source module analysis.fourier.fourier_transform
! leanprover-community/mathlib commit a231f964b9ec8d1e12a28326b556123258a52829
! leanprover-community/mathlib commit 3353f3371120058977ce1e20bf7fc8986c0fb042
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
Expand Down Expand Up @@ -265,9 +265,12 @@ theorem fourierIntegral_def (f : ℝ → E) (w : ℝ) :
rfl
#align real.fourier_integral_def Real.fourierIntegral_def

-- mathport name: fourier_integral
scoped[FourierTransform] notation "𝓕" => Real.fourierIntegral

theorem fourierIntegral_eq_integral_exp_smul {E : Type _} [NormedAddCommGroup E] [CompleteSpace E]
[NormedSpace ℂ E] (f : ℝ → E) (w : ℝ) :
fourierIntegral f w = ∫ v : ℝ, Complex.exp (↑(-2 * π * v * w) * Complex.i) • f v := by
𝓕 f w = ∫ v : ℝ, Complex.exp (↑(-2 * π * v * w) * Complex.i) • f v := by
simp_rw [fourier_integral_def, Real.fourierChar_apply, mul_neg, neg_mul, mul_assoc]
#align real.fourier_integral_eq_integral_exp_smul Real.fourierIntegral_eq_integral_exp_smul

Expand Down
131 changes: 131 additions & 0 deletions Mathbin/Analysis/Fourier/PoissonSummation.lean
@@ -0,0 +1,131 @@
/-
Copyright (c) 2023 David Loeffler. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: David Loeffler
! This file was ported from Lean 3 source module analysis.fourier.poisson_summation
! leanprover-community/mathlib commit 3353f3371120058977ce1e20bf7fc8986c0fb042
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.Analysis.Fourier.AddCircle
import Mathbin.Analysis.Fourier.FourierTransform

/-!
# Poisson's summation formula
We prove Poisson's summation formula `∑ (n : ℤ), f n = ∑ (n : ℤ), 𝓕 f n`, where `𝓕 f` is the
Fourier transform of `f`, under the following hypotheses:
* `f` is a continuous function `ℝ → ℂ`.
* The sum `∑ (n : ℤ), 𝓕 f n` is convergent.
* For all compacts `K ⊂ ℝ`, the sum `∑ (n : ℤ), sup { ‖f(x + n)‖ | x ∈ K }` is convergent.
## TODO
* Show that the conditions on `f` are automatically satisfied for Schwartz functions.
-/


noncomputable section

open Function hiding comp_apply

open Complex Real

open Set hiding restrict_apply

open TopologicalSpace Filter MeasureTheory

open Real BigOperators Filter FourierTransform

attribute [local instance] Real.fact_zero_lt_one

open ContinuousMap

/-- The key lemma for Poisson summation: the `m`-th Fourier coefficient of the periodic function
`∑' n : ℤ, f (x + n)` is the value at `m` of the Fourier transform of `f`. -/
theorem Real.fourierCoeff_tsum_comp_add {f : C(ℝ, ℂ)}
(hf : ∀ K : Compacts ℝ, Summable fun n : ℤ => ‖(f.comp (ContinuousMap.addRight n)).restrict K‖)
(m : ℤ) : fourierCoeff (Periodic.lift <| f.periodic_tsum_comp_add_zsmul 1) m = 𝓕 f m :=
by
-- NB: This proof can be shortened somewhat by telescoping together some of the steps in the calc
-- block, but I think it's more legible this way. We start with preliminaries about the integrand.
let e : C(ℝ, ℂ) := (fourier (-m)).comp ⟨(coe : ℝ → UnitAddCircle), continuous_quotient_mk'⟩
have neK : ∀ (K : compacts ℝ) (g : C(ℝ, ℂ)), ‖(e * g).restrict K‖ = ‖g.restrict K‖ :=
by
have : ∀ x : ℝ, ‖e x‖ = 1 := fun x => abs_coe_circle _
intro K g
simp_rw [norm_eq_supr_norm, restrict_apply, mul_apply, norm_mul, this, one_mul]
have eadd : ∀ n : ℤ, e.comp (ContinuousMap.addRight n) = e :=
by
intro n
ext1 x
have : periodic e 1 := periodic.comp (fun x => AddCircle.coe_add_period 1 x) _
simpa only [mul_one] using this.int_mul n x
-- Now the main argument. First unwind some definitions.
calc
fourierCoeff (periodic.lift <| f.periodic_tsum_comp_add_zsmul 1) m =
∫ x in 0 ..1, e x * (∑' n : ℤ, f.comp (ContinuousMap.addRight n)) x :=
by
simp_rw [fourierCoeff_eq_intervalIntegral _ m 0, div_one, one_smul, zero_add, comp_apply,
coe_mk, periodic.lift_coe, zsmul_one, smul_eq_mul]
-- Transform sum in C(ℝ, ℂ) evaluated at x into pointwise sum of values.
_ =
∫ x in 0 ..1, ∑' n : ℤ, (e * f.comp (ContinuousMap.addRight n)) x :=
by
simp_rw [coe_mul, Pi.mul_apply, ← tsum_apply (summable_of_locally_summable_norm hf),
tsum_mul_left]
-- Swap sum and integral.
_ =
∑' n : ℤ, ∫ x in 0 ..1, (e * f.comp (ContinuousMap.addRight n)) x :=
by
refine' (intervalIntegral.tsum_intervalIntegral_eq_of_summable_norm _).symm
convert hf ⟨uIcc 0 1, isCompact_uIcc⟩
exact funext fun n => neK _ _
_ = ∑' n : ℤ, ∫ x in 0 ..1, (e * f).comp (ContinuousMap.addRight n) x :=
by
simp only [ContinuousMap.comp_apply, mul_comp] at eadd⊢
simp_rw [eadd]
-- Rearrange sum of interval integrals into an integral over `ℝ`.
_ =
∫ x, e x * f x :=
by
suffices : integrable ⇑(e * f); exact this.has_sum_interval_integral_comp_add_int.tsum_eq
apply integrable_of_summable_norm_Icc
convert hf ⟨Icc 0 1, is_compact_Icc⟩
simp_rw [ContinuousMap.comp_apply, mul_comp] at eadd⊢
simp_rw [eadd]
exact funext fun n => neK ⟨Icc 0 1, is_compact_Icc⟩ _
-- Minor tidying to finish
_ =
𝓕 f m :=
by
rw [fourier_integral_eq_integral_exp_smul]
congr 1 with x : 1
rw [smul_eq_mul, comp_apply, coe_mk, fourier_coe_apply]
congr 2
push_cast
ring

#align real.fourier_coeff_tsum_comp_add Real.fourierCoeff_tsum_comp_add

/-- **Poisson's summation formula**. -/
theorem Real.tsum_eq_tsum_fourierIntegral {f : C(ℝ, ℂ)}
(h_norm :
∀ K : Compacts ℝ, Summable fun n : ℤ => ‖(f.comp <| ContinuousMap.addRight n).restrict K‖)
(h_sum : Summable fun n : ℤ => 𝓕 f n) : (∑' n : ℤ, f n) = ∑' n : ℤ, 𝓕 f n :=
by
let F : C(UnitAddCircle, ℂ) :=
⟨(f.periodic_tsum_comp_add_zsmul 1).lift, continuous_coinduced_dom.mpr (map_continuous _)⟩
have : Summable (fourierCoeff F) := by
convert h_sum
exact funext fun n => Real.fourierCoeff_tsum_comp_add h_norm n
convert (has_pointwise_sum_fourier_series_of_summable this 0).tsum_eq.symm using 1
· have := (has_sum_apply (summable_of_locally_summable_norm h_norm).HasSum 0).tsum_eq
simpa only [coe_mk, ← QuotientAddGroup.mk_zero, periodic.lift_coe, zsmul_one, comp_apply,
coe_add_right, zero_add] using this
· congr 1 with n : 1
rw [← Real.fourierCoeff_tsum_comp_add h_norm n, fourier_eval_zero, smul_eq_mul, mul_one]
rfl
#align real.tsum_eq_tsum_fourier_integral Real.tsum_eq_tsum_fourierIntegral

4 changes: 2 additions & 2 deletions Mathbin/Analysis/Fourier/RiemannLebesgueLemma.lean
Expand Up @@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: David Loeffler
! This file was ported from Lean 3 source module analysis.fourier.riemann_lebesgue_lemma
! leanprover-community/mathlib commit a231f964b9ec8d1e12a28326b556123258a52829
! leanprover-community/mathlib commit 3353f3371120058977ce1e20bf7fc8986c0fb042
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
Expand Down Expand Up @@ -193,7 +193,7 @@ open FourierTransform
/-- Riemann-Lebesgue lemma for continuous compactly-supported functions: the Fourier transform
tends to 0 at infinity. -/
theorem Real.fourierIntegral_zero_at_infty_of_continuous_compact_support (hc : Continuous f)
(hs : HasCompactSupport f) : Tendsto (Real.fourierIntegral f) (cocompact ℝ) (𝓝 0) :=
(hs : HasCompactSupport f) : Tendsto (𝓕 f) (cocompact ℝ) (𝓝 0) :=
by
refine'
((zero_at_infty_integral_mul_exp_of_continuous_compact_support hc hs).comp
Expand Down
4 changes: 2 additions & 2 deletions Mathbin/Data/Finset/Basic.lean

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions Mathbin/Data/Finset/Image.lean

Large diffs are not rendered by default.

38 changes: 24 additions & 14 deletions Mathbin/MeasureTheory/Group/Measure.lean
Expand Up @@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Floris van Doorn
! This file was ported from Lean 3 source module measure_theory.group.measure
! leanprover-community/mathlib commit f2ce6086713c78a7f880485f7917ea547a215982
! leanprover-community/mathlib commit 950605e4b9b4e2827681f637ba997307814a5ca9
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
Expand Down Expand Up @@ -249,17 +249,21 @@ end HasMeasurableMul

end Mul

section Group
section DivInvMonoid

variable [Group G]
variable [DivInvMonoid G]

@[to_additive]
theorem map_div_right_eq_self (μ : Measure G) [IsMulRightInvariant μ] (g : G) : map (· / g) μ = μ :=
by simp_rw [div_eq_mul_inv, map_mul_right_eq_self μ g⁻¹]
#align measure_theory.map_div_right_eq_self MeasureTheory.map_div_right_eq_self
#align measure_theory.map_sub_right_eq_self MeasureTheory.map_sub_right_eq_self

variable [HasMeasurableMul G]
end DivInvMonoid

section Group

variable [Group G] [HasMeasurableMul G]

@[to_additive]
theorem measurePreservingDivRight (μ : Measure G) [IsMulRightInvariant μ] (g : G) :
Expand Down Expand Up @@ -427,9 +431,9 @@ instance (μ : Measure G) [SigmaFinite μ] : SigmaFinite μ.inv :=

end InvolutiveInv

section mul_inv
section DivisionMonoid

variable [Group G] [HasMeasurableMul G] [HasMeasurableInv G] {μ : Measure G}
variable [DivisionMonoid G] [HasMeasurableMul G] [HasMeasurableInv G] {μ : Measure G}

@[to_additive]
instance [IsMulLeftInvariant μ] : IsMulRightInvariant μ.inv :=
Expand Down Expand Up @@ -479,29 +483,35 @@ theorem map_mul_right_inv_eq_self (μ : Measure G) [IsInvInvariant μ] [IsMulLef
#align measure_theory.measure.map_mul_right_inv_eq_self MeasureTheory.Measure.map_mul_right_inv_eq_self
#align measure_theory.measure.map_add_right_neg_eq_self MeasureTheory.Measure.map_add_right_neg_eq_self

end DivisionMonoid

section Group

variable [Group G] [HasMeasurableMul G] [HasMeasurableInv G] {μ : Measure G}

@[to_additive]
theorem map_div_left_ae (μ : Measure G) [IsMulLeftInvariant μ] [IsInvInvariant μ] (x : G) :
Filter.map (fun t => x / t) μ.ae = μ.ae :=
((MeasurableEquiv.divLeft x).map_ae μ).trans <| congr_arg ae <| map_div_left_eq_self μ x
#align measure_theory.measure.map_div_left_ae MeasureTheory.Measure.map_div_left_ae
#align measure_theory.measure.map_sub_left_ae MeasureTheory.Measure.map_sub_left_ae

end mul_inv
end Group

end Measure

section TopologicalGroup

variable [TopologicalSpace G] [BorelSpace G] {μ : Measure G}

variable [Group G] [TopologicalGroup G]
variable [TopologicalSpace G] [BorelSpace G] {μ : Measure G} [Group G]

@[to_additive]
instance Measure.Regular.inv [T2Space G] [Regular μ] : Regular μ.inv :=
instance Measure.Regular.inv [ContinuousInv G] [T2Space G] [Regular μ] : Regular μ.inv :=
Regular.map (Homeomorph.inv G)
#align measure_theory.measure.regular.inv MeasureTheory.Measure.Regular.inv
#align measure_theory.measure.regular.neg MeasureTheory.Measure.Regular.neg

variable [TopologicalGroup G]

@[to_additive]
theorem regular_inv_iff [T2Space G] : μ.inv.regular ↔ μ.regular :=
by
Expand Down Expand Up @@ -657,9 +667,9 @@ theorem measure_univ_of_isMulLeftInvariant [LocallyCompactSpace G] [NoncompactSp

end TopologicalGroup

section CommGroup
section CommSemigroup

variable [CommGroup G]
variable [CommSemigroup G]

/-- In an abelian group every left invariant measure is also right-invariant.
We don't declare the converse as an instance, since that would loop type-class inference, and
Expand All @@ -672,7 +682,7 @@ instance (priority := 100) IsMulLeftInvariant.isMulRightInvariant {μ : Measure
#align measure_theory.is_mul_left_invariant.is_mul_right_invariant MeasureTheory.IsMulLeftInvariant.isMulRightInvariant
#align is_add_left_invariant.is_add_right_invariant IsAddLeftInvariant.is_add_right_invariant

end CommGroup
end CommSemigroup

section Haar

Expand Down
15 changes: 14 additions & 1 deletion Mathbin/MeasureTheory/Measure/MeasureSpace.lean
Expand Up @@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Mario Carneiro
! This file was ported from Lean 3 source module measure_theory.measure.measure_space
! leanprover-community/mathlib commit a75898643b2d774cced9ae7c0b28c21663b99666
! leanprover-community/mathlib commit 3f5c9d30716c775bda043456728a1a3ee31412e7
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
Expand Down Expand Up @@ -2143,6 +2143,19 @@ theorem sum_smul_dirac [Countable α] [MeasurableSingletonClass α] (μ : Measur
(sum fun a => μ {a} • dirac a) = μ := by simpa using (map_eq_sum μ id measurable_id).symm
#align measure_theory.measure.sum_smul_dirac MeasureTheory.Measure.sum_smul_dirac

/-- Given that `α` is a countable, measurable space with all singleton sets measurable,
write the measure of a set `s` as the sum of the measure of `{x}` for all `x ∈ s`. -/
theorem tsum_indicator_apply_singleton [Countable α] [MeasurableSingletonClass α] (μ : Measure α)
(s : Set α) (hs : MeasurableSet s) : (∑' x : α, s.indicator (fun x => μ {x}) x) = μ s :=
calc
(∑' x : α, s.indicator (fun x => μ {x}) x) = Measure.sum (fun a => μ {a} • Measure.dirac a) s :=
by
simp only [measure.sum_apply _ hs, measure.smul_apply, smul_eq_mul, measure.dirac_apply,
Set.indicator_apply, mul_ite, Pi.one_apply, mul_one, mul_zero]
_ = μ s := by rw [μ.sum_smul_dirac]

#align measure_theory.measure.tsum_indicator_apply_singleton MeasureTheory.Measure.tsum_indicator_apply_singleton

omit m0

end Sum
Expand Down

0 comments on commit 9cb5deb

Please sign in to comment.