Sphere Packing in R^8

5. Fourier Analysis🔗

Recall the definition of a Fourier transform.

Definition5.1
Group: Fourier transform and Schwartz-space preliminaries. (3)
Hover another entry in this group to preview it.
L∃∀N

The Fourier transform of an L^1-function f:\R^d\to\C is defined as \mathcal{F}(f)(y) = \widehat{f}(y) := \int_{\R^d} f(x)e^{-2\pi i \langle x, y \rangle} \,\mathrm{d}x, \quad y \in \R^d where \langle x, y \rangle = \frac12\|x\|^2 + \frac12\|y\|^2 - \frac12\|x - y\|^2 is the standard scalar product in \R^d.

Lean code for Definition5.11 definition
  • def Real.fourierIntegral.{u, v} {EType u : Type uA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } {FoutParam (Type v) : outParamoutParam.{u} (α : Sort u) : Sort uGadget for marking output parameters in type classes.
    
    For example, the `Membership` class is defined as:
    ```
    class Membership (α : outParam (Type u)) (γ : Type v)
    ```
    This means that whenever a typeclass goal of the form `Membership ?α ?γ` comes
    up, Lean will wait to solve it until `?γ` is known, but then it will run
    typeclass inference, and take the first solution it finds, for any value of `?α`,
    which thereby determines what `?α` should be.
    
    This expresses that in a term like `a ∈ s`, `s` might be a `Set α` or
    `List α` or some other type with a membership operation, and in each case
    the "member" type `α` is determined by looking at the container type.
     (Type v)A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [selfFourierTransform E F : FourierTransformFourierTransform.{u, v} (E : Type u) (F : outParam (Type v)) : Type (max u v)The notation typeclass for the Fourier transform.
    
    While the Fourier transform is a linear operator, the notation is for the function `E → F` without
    any additional properties. This makes it possible to use the notation for functions where
    integrability is an issue.
    Moreover, including a scalar multiplication causes problems for inferring the notation type class.
     EType u FoutParam (Type v)] : EType u  FoutParam (Type v)
    def Real.fourierIntegral.{u, v} {EType u : Type uA type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      {FoutParam (Type v) : outParamoutParam.{u} (α : Sort u) : Sort uGadget for marking output parameters in type classes.
    
    For example, the `Membership` class is defined as:
    ```
    class Membership (α : outParam (Type u)) (γ : Type v)
    ```
    This means that whenever a typeclass goal of the form `Membership ?α ?γ` comes
    up, Lean will wait to solve it until `?γ` is known, but then it will run
    typeclass inference, and take the first solution it finds, for any value of `?α`,
    which thereby determines what `?α` should be.
    
    This expresses that in a term like `a ∈ s`, `s` might be a `Set α` or
    `List α` or some other type with a membership operation, and in each case
    the "member" type `α` is determined by looking at the container type.
     (Type v)A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [selfFourierTransform E F : FourierTransformFourierTransform.{u, v} (E : Type u) (F : outParam (Type v)) : Type (max u v)The notation typeclass for the Fourier transform.
    
    While the Fourier transform is a linear operator, the notation is for the function `E → F` without
    any additional properties. This makes it possible to use the notation for functions where
    integrability is an issue.
    Moreover, including a scalar multiplication causes problems for inferring the notation type class.
     EType u FoutParam (Type v)] : EType u  FoutParam (Type v)
    **Alias** of `FourierTransform.fourier`.
    complete

The following computational result will be of use later on.

Lemma5.2
Group: Fourier transform and Schwartz-space preliminaries. (3)
Hover another entry in this group to preview it.
XL∃∀N
Used by 2
Hover a use site to preview it.
Preview
Lemma 8.12
Loading preview
Hover a use site to preview it.

\mathcal{F}(e^{\pi i \|x\|^2 z})(y) = z^{-4}\,e^{\pi i \|y\|^2 \,(\frac{-1}{z}) }. This uses Definition 5.1.

Proof

Fill in proof.

Of great interest to us is a specific family of functions, known as Schwartz functions. The Fourier transform behaves particularly well when acting on Schwartz functions. We elaborate in the following subsections.

Definition5.3
Group: Fourier transform and Schwartz-space preliminaries. (3)
Hover another entry in this group to preview it.
L∃∀N
Used by 3
Hover a use site to preview it.

A C^\infty function f:\R^d\to\C is called a Schwartz function if it decays to zero as \|x\|\to\infty faster than any inverse power of \|x\|, and the same holds for all partial derivatives of f. That is, for all k, n \in \N, there exists a constant C \in \R such that for all x \in \R^d, \norm{x}^k \cdot \norm{f^{(n)}(x)} \leq C, where f^{(n)} denotes the n-th derivative of f together with the appropriate operator norm. The set of all Schwartz functions from \R^d to \C is called the Schwartz space. It is an \R-vector space.

Lean code for Definition5.31 definition
  • abbrev BlueprintDocAliases.SchwartzMap.{u_1, u_2} (EType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (FType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      [NormedAddCommGroupNormedAddCommGroup.{u_8} (E : Type u_8) : Type u_8A normed group is an additive group endowed with a norm for which `dist x y = ‖-x + y‖` defines
    a metric space structure.  EType u_1] [NormedSpaceNormedSpace.{u_6, u_7} (𝕜 : Type u_6) (E : Type u_7) [NormedField 𝕜] [SeminormedAddCommGroup E] : Type (max u_6 u_7)A normed space over a normed field is a vector space endowed with a norm which satisfies the
    equality `‖c • x‖ = ‖c‖ ‖x‖`. We require only `‖c • x‖ ≤ ‖c‖ ‖x‖` in the definition, then prove
    `‖c • x‖ = ‖c‖ ‖x‖` in `norm_smul`.
    
    Note that since this requires `SeminormedAddCommGroup` and not `NormedAddCommGroup`, this
    typeclass can be used for "seminormed spaces" too, just as `Module` can be used for
    "semimodules".  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  EType u_1] [NormedAddCommGroupNormedAddCommGroup.{u_8} (E : Type u_8) : Type u_8A normed group is an additive group endowed with a norm for which `dist x y = ‖-x + y‖` defines
    a metric space structure.  FType u_2]
      [NormedSpaceNormedSpace.{u_6, u_7} (𝕜 : Type u_6) (E : Type u_7) [NormedField 𝕜] [SeminormedAddCommGroup E] : Type (max u_6 u_7)A normed space over a normed field is a vector space endowed with a norm which satisfies the
    equality `‖c • x‖ = ‖c‖ ‖x‖`. We require only `‖c • x‖ ≤ ‖c‖ ‖x‖` in the definition, then prove
    `‖c • x‖ = ‖c‖ ‖x‖` in `norm_smul`.
    
    Note that since this requires `SeminormedAddCommGroup` and not `NormedAddCommGroup`, this
    typeclass can be used for "seminormed spaces" too, just as `Module` can be used for
    "semimodules".  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  FType u_2] : Type (max u_1 u_2)A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. 
    abbrev BlueprintDocAliases.SchwartzMap.{u_1, u_2}
      (EType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) (FType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      [NormedAddCommGroupNormedAddCommGroup.{u_8} (E : Type u_8) : Type u_8A normed group is an additive group endowed with a norm for which `dist x y = ‖-x + y‖` defines
    a metric space structure.  EType u_1] [NormedSpaceNormedSpace.{u_6, u_7} (𝕜 : Type u_6) (E : Type u_7) [NormedField 𝕜] [SeminormedAddCommGroup E] : Type (max u_6 u_7)A normed space over a normed field is a vector space endowed with a norm which satisfies the
    equality `‖c • x‖ = ‖c‖ ‖x‖`. We require only `‖c • x‖ ≤ ‖c‖ ‖x‖` in the definition, then prove
    `‖c • x‖ = ‖c‖ ‖x‖` in `norm_smul`.
    
    Note that since this requires `SeminormedAddCommGroup` and not `NormedAddCommGroup`, this
    typeclass can be used for "seminormed spaces" too, just as `Module` can be used for
    "semimodules".  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  EType u_1]
      [NormedAddCommGroupNormedAddCommGroup.{u_8} (E : Type u_8) : Type u_8A normed group is an additive group endowed with a norm for which `dist x y = ‖-x + y‖` defines
    a metric space structure.  FType u_2]
      [NormedSpaceNormedSpace.{u_6, u_7} (𝕜 : Type u_6) (E : Type u_7) [NormedField 𝕜] [SeminormedAddCommGroup E] : Type (max u_6 u_7)A normed space over a normed field is a vector space endowed with a norm which satisfies the
    equality `‖c • x‖ = ‖c‖ ‖x‖`. We require only `‖c • x‖ ≤ ‖c‖ ‖x‖` in the definition, then prove
    `‖c • x‖ = ‖c‖ ‖x‖` in `norm_smul`.
    
    Note that since this requires `SeminormedAddCommGroup` and not `NormedAddCommGroup`, this
    typeclass can be used for "seminormed spaces" too, just as `Module` can be used for
    "semimodules".  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  FType u_2] : Type (max u_1 u_2)A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. 
    The space of Schwartz functions. 
    complete
Lemma5.4
Group: Fourier transform and Schwartz-space preliminaries. (3)
Hover another entry in this group to preview it.
Preview
Definition 5.1
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

The Fourier transform is a continuous linear automorphism of the space of Schwartz functions. This uses Definition 5.1 and Definition 5.3.

Lean code for Lemma5.41 definition
  • def SchwartzMap.fourierTransformCLM.{u_1, u_2, u_3} (𝕜Type u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. )
      [RCLikeRCLike.{u_1} (K : semiOutParam (Type u_1)) : Type u_1This typeclass captures properties shared by ℝ and ℂ, with an API that closely matches that of ℂ.
     𝕜Type u_1] {EType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [NormedAddCommGroupNormedAddCommGroup.{u_8} (E : Type u_8) : Type u_8A normed group is an additive group endowed with a norm for which `dist x y = ‖-x + y‖` defines
    a metric space structure.  EType u_2] [NormedSpaceNormedSpace.{u_6, u_7} (𝕜 : Type u_6) (E : Type u_7) [NormedField 𝕜] [SeminormedAddCommGroup E] : Type (max u_6 u_7)A normed space over a normed field is a vector space endowed with a norm which satisfies the
    equality `‖c • x‖ = ‖c‖ ‖x‖`. We require only `‖c • x‖ ≤ ‖c‖ ‖x‖` in the definition, then prove
    `‖c • x‖ = ‖c‖ ‖x‖` in `norm_smul`.
    
    Note that since this requires `SeminormedAddCommGroup` and not `NormedAddCommGroup`, this
    typeclass can be used for "seminormed spaces" too, just as `Module` can be used for
    "semimodules".  Complex : TypeComplex numbers consist of two `Real`s: a real part `re` and an imaginary part `im`.  EType u_2]
      [NormedSpaceNormedSpace.{u_6, u_7} (𝕜 : Type u_6) (E : Type u_7) [NormedField 𝕜] [SeminormedAddCommGroup E] : Type (max u_6 u_7)A normed space over a normed field is a vector space endowed with a norm which satisfies the
    equality `‖c • x‖ = ‖c‖ ‖x‖`. We require only `‖c • x‖ ≤ ‖c‖ ‖x‖` in the definition, then prove
    `‖c • x‖ = ‖c‖ ‖x‖` in `norm_smul`.
    
    Note that since this requires `SeminormedAddCommGroup` and not `NormedAddCommGroup`, this
    typeclass can be used for "seminormed spaces" too, just as `Module` can be used for
    "semimodules".  𝕜Type u_1 EType u_2] [SMulCommClassSMulCommClass.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M α] [SMul N α] : PropA typeclass mixin saying that two multiplicative actions on the same space commute.  Complex : TypeComplex numbers consist of two `Real`s: a real part `re` and an imaginary part `im`.  𝕜Type u_1 EType u_2] {VType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [NormedAddCommGroupNormedAddCommGroup.{u_8} (E : Type u_8) : Type u_8A normed group is an additive group endowed with a norm for which `dist x y = ‖-x + y‖` defines
    a metric space structure.  VType u_3] [InnerProductSpaceInnerProductSpace.{u_4, u_5} (𝕜 : Type u_4) (E : Type u_5) [RCLike 𝕜] [SeminormedAddCommGroup E] : Type (max u_4 u_5)A (pre) inner product space is a vector space with an additional operation called inner product.
    The (semi)norm could be derived from the inner product, instead we require the existence of a
    seminorm and the fact that `‖x‖^2 = re ⟪x, x⟫` to be able to put instances on `𝕂` or product spaces.
    
    Note that `NormedSpace` does not assume that `‖x‖=0` implies `x=0` (it is rather a seminorm).
    
    To construct a seminorm from an inner product, see `PreInnerProductSpace.ofCore`.
     Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  VType u_3] [FiniteDimensionalFiniteDimensional.{u_1, u_2} (K : Type u_1) (V : Type u_2) [DivisionRing K] [AddCommGroup V] [Module K V] : Prop`FiniteDimensional` vector spaces are defined to be finite modules.
    Use `Module.Basis.finiteDimensional_of_finite` to prove finite dimension from another definition.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  VType u_3]
      [MeasurableSpaceMeasurableSpace.{u_7} (α : Type u_7) : Type u_7A measurable space is a space equipped with a σ-algebra.  VType u_3] [BorelSpaceBorelSpace.{u_6} (α : Type u_6) [TopologicalSpace α] [MeasurableSpace α] : PropA space with `MeasurableSpace` and `TopologicalSpace` structures such that
    the `σ`-algebra of measurable sets is exactly the `σ`-algebra generated by open sets.  VType u_3] :
      SchwartzMapSchwartzMap.{u_5, u_6} (E : Type u_5) (F : Type u_6) [NormedAddCommGroup E] [NormedSpace ℝ E] [NormedAddCommGroup F]
      [NormedSpace ℝ F] : Type (max u_5 u_6)A function is a Schwartz function if it is smooth and all derivatives decay faster than
    any power of `‖x‖`.  VType u_3 EType u_2 →L[ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`. 𝕜Type u_1]ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`.  SchwartzMapSchwartzMap.{u_5, u_6} (E : Type u_5) (F : Type u_6) [NormedAddCommGroup E] [NormedSpace ℝ E] [NormedAddCommGroup F]
      [NormedSpace ℝ F] : Type (max u_5 u_6)A function is a Schwartz function if it is smooth and all derivatives decay faster than
    any power of `‖x‖`.  VType u_3 EType u_2
    def SchwartzMap.fourierTransformCLM.{u_1, u_2,
        u_3}
      (𝕜Type u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. ) [RCLikeRCLike.{u_1} (K : semiOutParam (Type u_1)) : Type u_1This typeclass captures properties shared by ℝ and ℂ, with an API that closely matches that of ℂ.
     𝕜Type u_1] {EType u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [NormedAddCommGroupNormedAddCommGroup.{u_8} (E : Type u_8) : Type u_8A normed group is an additive group endowed with a norm for which `dist x y = ‖-x + y‖` defines
    a metric space structure.  EType u_2] [NormedSpaceNormedSpace.{u_6, u_7} (𝕜 : Type u_6) (E : Type u_7) [NormedField 𝕜] [SeminormedAddCommGroup E] : Type (max u_6 u_7)A normed space over a normed field is a vector space endowed with a norm which satisfies the
    equality `‖c • x‖ = ‖c‖ ‖x‖`. We require only `‖c • x‖ ≤ ‖c‖ ‖x‖` in the definition, then prove
    `‖c • x‖ = ‖c‖ ‖x‖` in `norm_smul`.
    
    Note that since this requires `SeminormedAddCommGroup` and not `NormedAddCommGroup`, this
    typeclass can be used for "seminormed spaces" too, just as `Module` can be used for
    "semimodules".  Complex : TypeComplex numbers consist of two `Real`s: a real part `re` and an imaginary part `im`.  EType u_2]
      [NormedSpaceNormedSpace.{u_6, u_7} (𝕜 : Type u_6) (E : Type u_7) [NormedField 𝕜] [SeminormedAddCommGroup E] : Type (max u_6 u_7)A normed space over a normed field is a vector space endowed with a norm which satisfies the
    equality `‖c • x‖ = ‖c‖ ‖x‖`. We require only `‖c • x‖ ≤ ‖c‖ ‖x‖` in the definition, then prove
    `‖c • x‖ = ‖c‖ ‖x‖` in `norm_smul`.
    
    Note that since this requires `SeminormedAddCommGroup` and not `NormedAddCommGroup`, this
    typeclass can be used for "seminormed spaces" too, just as `Module` can be used for
    "semimodules".  𝕜Type u_1 EType u_2] [SMulCommClassSMulCommClass.{u_9, u_10, u_11} (M : Type u_9) (N : Type u_10) (α : Type u_11) [SMul M α] [SMul N α] : PropA typeclass mixin saying that two multiplicative actions on the same space commute.  Complex : TypeComplex numbers consist of two `Real`s: a real part `re` and an imaginary part `im`.  𝕜Type u_1 EType u_2]
      {VType u_3 : Type u_3A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [NormedAddCommGroupNormedAddCommGroup.{u_8} (E : Type u_8) : Type u_8A normed group is an additive group endowed with a norm for which `dist x y = ‖-x + y‖` defines
    a metric space structure.  VType u_3]
      [InnerProductSpaceInnerProductSpace.{u_4, u_5} (𝕜 : Type u_4) (E : Type u_5) [RCLike 𝕜] [SeminormedAddCommGroup E] : Type (max u_4 u_5)A (pre) inner product space is a vector space with an additional operation called inner product.
    The (semi)norm could be derived from the inner product, instead we require the existence of a
    seminorm and the fact that `‖x‖^2 = re ⟪x, x⟫` to be able to put instances on `𝕂` or product spaces.
    
    Note that `NormedSpace` does not assume that `‖x‖=0` implies `x=0` (it is rather a seminorm).
    
    To construct a seminorm from an inner product, see `PreInnerProductSpace.ofCore`.
     Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  VType u_3]
      [FiniteDimensionalFiniteDimensional.{u_1, u_2} (K : Type u_1) (V : Type u_2) [DivisionRing K] [AddCommGroup V] [Module K V] : Prop`FiniteDimensional` vector spaces are defined to be finite modules.
    Use `Module.Basis.finiteDimensional_of_finite` to prove finite dimension from another definition.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  VType u_3]
      [MeasurableSpaceMeasurableSpace.{u_7} (α : Type u_7) : Type u_7A measurable space is a space equipped with a σ-algebra.  VType u_3] [BorelSpaceBorelSpace.{u_6} (α : Type u_6) [TopologicalSpace α] [MeasurableSpace α] : PropA space with `MeasurableSpace` and `TopologicalSpace` structures such that
    the `σ`-algebra of measurable sets is exactly the `σ`-algebra generated by open sets.  VType u_3] :
      SchwartzMapSchwartzMap.{u_5, u_6} (E : Type u_5) (F : Type u_6) [NormedAddCommGroup E] [NormedSpace ℝ E] [NormedAddCommGroup F]
      [NormedSpace ℝ F] : Type (max u_5 u_6)A function is a Schwartz function if it is smooth and all derivatives decay faster than
    any power of `‖x‖`.  VType u_3 EType u_2 →L[ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`. 𝕜Type u_1]ContinuousLinearMap.{u_1, u_2, u_3, u_4} {R : Type u_1} {S : Type u_2} [Semiring R] [Semiring S] (σ : R →+* S)
      (M : Type u_3) [TopologicalSpace M] [AddCommMonoid M] (M₂ : Type u_4) [TopologicalSpace M₂] [AddCommMonoid M₂]
      [Module R M] [Module S M₂] : Type (max u_3 u_4)Continuous linear maps between modules. We only put the type classes that are necessary for the
    definition, although in applications `M` and `M₂` will be topological modules over the topological
    ring `R`.  SchwartzMapSchwartzMap.{u_5, u_6} (E : Type u_5) (F : Type u_6) [NormedAddCommGroup E] [NormedSpace ℝ E] [NormedAddCommGroup F]
      [NormedSpace ℝ F] : Type (max u_5 u_6)A function is a Schwartz function if it is smooth and all derivatives decay faster than
    any power of `‖x‖`.  VType u_3 EType u_2
    The Fourier transform on a real inner product space, as a continuous linear map on the
    Schwartz space.
    
    This definition is only to define the Fourier transform, use `FourierTransform.fourierCLM` instead.
    
    complete
Proof

We do not elaborate here, as the result already exists in Mathlib. We do, however, mention that the Lean implementation defines a continuous linear equivalence on the Schwartz space using the Fourier transform. The proof that for any Schwartz function f, its Fourier transform and its image under this continuous linear equivalence are the same \R^d \to \R function is stated in Mathlib solely for the purpose of rw and simp, and is proved simply by rfl.

Another reason we are interested in Schwartz functions is that they behave well under infinite sums. This will be useful when proving the Cohn-Elkies linear programming bound.

We begin by stating a general summability result over specific subsets of \R^d.

Lemma5.5
Group: Summability lemmas and Poisson summation over lattices. (3)
Hover another entry in this group to preview it.
XL∃∀Nused by 1

Let X \subset \R^d be a set of sphere-packing centers of separation 1 that is periodic with some lattice \Lambda \subset \R^d. Then there exists k \in \N sufficiently large such that \sum_{x \in X} \frac{1}{\norm{x}^{k}} < \infty.

Proof

First, note that it does not matter how we number the countably many elements of the discrete set X: if we prove absolute convergence for one numbering, we prove absolute convergence for any numbering. The idea is to bound the sequence of partial sums by considering the volumes of concentric d-spheres of the appropriate radii, or scaled versions of a zero-centered fundamental domain. /- source paragraph break -/ Finish.

The decaying property of Schwartz functions means that they can be compared with the absolutely convergent power series above.

Lemma5.6
Group: Summability lemmas and Poisson summation over lattices. (3)
Hover another entry in this group to preview it.
XL∃∀Nused by 1

Let f : \R^d \to \C be a Schwartz function and let X \subset \R^d be periodic with respect to some lattice \Lambda \subset \R^d. Then \sum_{x \in X} |f(x)| < \infty. This uses Definition 5.3.

Proof

Without loss of generality, assume that 0 \notin X: if 0 \in X, we can add the f(0) term to the sum over nonzero elements of X. We know that for all k \in \N there exists some constant C such that |f(x)| \leq C\norm{x}^{-k} for all x \in \R^d. Choosing k to be sufficiently large, we obtain \sum_{x \in X} |f(x)| \leq \sum_{x \in X} \frac{C}{\norm{x}^{k}} = C \sum_{x \in X} \frac{1}{\norm{x}^k} < \infty.

We end with a crucial result on Schwartz functions, the statement of which only makes sense because of the above result.

Theorem5.7
Group: Summability lemmas and Poisson summation over lattices. (3)
Hover another entry in this group to preview it.
L∃∀Nused by 1

Let \Lambda be a lattice in \R^d, and let f:\R^d\to\R be a Schwartz function. Then, for all v \in \R^d, \sum_{\ell\in\Lambda}f(\ell + v) = \frac{1}{\Vol{\R^d/\Lambda}} \sum_{m\in\Lambda^*}\widehat{f}(m) e^{-2\pi i \ang{v, m}}. This uses Definition 5.1, Definition 5.3, Lemma 5.6, Lemma 5.5, and Definition 2.11.

Lean code for Theorem5.71 theorem, incomplete
  • theorem SchwartzMap.PoissonSummation_Lattices {d : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    } [FactFact (p : Prop) : PropWrapper for adding elementary propositions to the type class systems.
    Warning: this can easily be abused. See the rest of this docstring for details.
    
    Certain propositions should not be treated as a class globally,
    but sometimes it is very convenient to be able to use the type class system
    in specific circumstances.
    
    For example, `ZMod p` is a field if and only if `p` is a prime number.
    In order to be able to find this field instance automatically by type class search,
    we have to turn `p.prime` into an instance implicit assumption.
    
    On the other hand, making `Nat.prime` a class would require a major refactoring of the library,
    and it is questionable whether making `Nat.prime` a class is desirable at all.
    The compromise is to add the assumption `[Fact p.prime]` to `ZMod.field`.
    
    In particular, this class is not intended for turning the type class system
    into an automated theorem prover for first-order logic.  (LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`.0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. d)LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`.]
      (ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d)) : SubmoduleSubmodule.{u, v} (R : Type u) (M : Type v) [Semiring R] [AddCommMonoid M] [Module R M] : Type vA submodule of a module is one which is closed under vector operations.
    This is a sufficient condition for the subset of vectors in the submodule
    to themselves form a module.  Int : TypeThe integers.
    
    This type is special-cased by the compiler and overridden with an efficient implementation. The
    runtime has a special representation for `Int` that stores “small” signed numbers directly, while
    larger numbers use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)). A “small number” is an integer that can be encoded with one fewer bits
    than the platform's pointer size (i.e. 63 bits on 64-bit architectures and 31 bits on 32-bit
    architectures).
     (EuclideanSpaceEuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     d))) [DiscreteTopologyDiscreteTopology.{u_2} (α : Type u_2) [t : TopologicalSpace α] : PropA topological space is discrete if every set is open, that is,
    its topology equals the discrete topology `⊥`.  ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d))]
      [IsZLatticeIsZLattice.{u_1, u_2} (K : Type u_1) [NormedField K] {E : Type u_2} [NormedAddCommGroup E] [NormedSpace K E]
      (L : Submodule ℤ E) [DiscreteTopology ↥L] : Prop`L : Submodule ℤ E` where `E` is a vector space over a normed field `K` is a `ℤ`-lattice if
    it is discrete and spans `E` over `K`.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d))] (fSchwartzMap (EuclideanSpace ℝ (Fin d)) ℂ : SchwartzMapSchwartzMap.{u_5, u_6} (E : Type u_5) (F : Type u_6) [NormedAddCommGroup E] [NormedSpace ℝ E] [NormedAddCommGroup F]
      [NormedSpace ℝ F] : Type (max u_5 u_6)A function is a Schwartz function if it is smooth and all derivatives decay faster than
    any power of `‖x‖`.  (EuclideanSpaceEuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     d)) Complex : TypeComplex numbers consist of two `Real`s: a real part `re` and an imaginary part `im`. )
      (vEuclideanSpace ℝ (Fin d) : EuclideanSpaceEuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     d)) :
      ∑'tsum.{u_4, u_5} {α : Type u_4} {β : Type u_5} [AddCommMonoid α] [TopologicalSpace α] (f : β → α)
      (L : SummationFilter β := SummationFilter.unconditional β) : α`∑' i, f i` is the unconditional sum of `f` if it exists, or 0 otherwise.
    
    More generally, if `L` is a `SummationFilter`, `∑'[L] i, f i` is the sum of `f` with respect to
    `L` if it exists, and `0` otherwise.
    
    (Note that even if the unconditional sum exists, it might not be unique if the topology is not
    separated. When the support of `f` is finite, we make the most reasonable choice, to use the sum
    over the support. Otherwise, we choose arbitrarily an `a` satisfying `HasSum f a`. Similar remarks
    apply to more general summation filters.)
     (↥Λ : ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d))),tsum.{u_4, u_5} {α : Type u_4} {β : Type u_5} [AddCommMonoid α] [TopologicalSpace α] (f : β → α)
      (L : SummationFilter β := SummationFilter.unconditional β) : α`∑' i, f i` is the unconditional sum of `f` if it exists, or 0 otherwise.
    
    More generally, if `L` is a `SummationFilter`, `∑'[L] i, f i` is the sum of `f` with respect to
    `L` if it exists, and `0` otherwise.
    
    (Note that even if the unconditional sum exists, it might not be unique if the topology is not
    separated. When the support of `f` is finite, we make the most reasonable choice, to use the sum
    over the support. Otherwise, we choose arbitrarily an `a` satisfying `HasSum f a`. Similar remarks
    apply to more general summation filters.)
     fSchwartzMap (EuclideanSpace ℝ (Fin d)) ℂ (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.vEuclideanSpace ℝ (Fin d) +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. ↥Λ)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        1 /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`. (ZLattice.covolumeZLattice.covolume.{u_1} {E : Type u_1} [NormedAddCommGroup E] [MeasurableSpace E] (L : Submodule ℤ E)
      (μ : MeasureTheory.Measure E := by volume_tac) : ℝThe covolume of a `ℤ`-lattice is the volume of some fundamental domain; see
    `ZLattice.covolume_eq_volume` for the proof that the volume does not depend on the choice of
    the fundamental domain.  ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d)) MeasureTheory.volumeMeasureTheory.MeasureSpace.volume.{u_6} {α : Type u_6} [self : MeasureTheory.MeasureSpace α] : MeasureTheory.Measure α`volume` is the canonical measure on `α`. ) *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
          ∑'tsum.{u_4, u_5} {α : Type u_4} {β : Type u_5} [AddCommMonoid α] [TopologicalSpace α] (f : β → α)
      (L : SummationFilter β := SummationFilter.unconditional β) : α`∑' i, f i` is the unconditional sum of `f` if it exists, or 0 otherwise.
    
    More generally, if `L` is a `SummationFilter`, `∑'[L] i, f i` is the sum of `f` with respect to
    `L` if it exists, and `0` otherwise.
    
    (Note that even if the unconditional sum exists, it might not be unique if the topology is not
    separated. When the support of `f` is finite, we make the most reasonable choice, to use the sum
    over the support. Otherwise, we choose arbitrarily an `a` satisfying `HasSum f a`. Similar remarks
    apply to more general summation filters.)
     (m↥(LinearMap.BilinForm.dualSubmodule (innerₗ (EuclideanSpace ℝ (Fin d))) Λ) :
            (LinearMap.BilinForm.dualSubmoduleLinearMap.BilinForm.dualSubmodule.{u_1, u_2, u_3} {R : Type u_1} {S : Type u_2} {M : Type u_3} [CommRing R] [Field S]
      [AddCommGroup M] [Algebra R S] [Module R M] [Module S M] [IsScalarTower R S M] (B : LinearMap.BilinForm S M)
      (N : Submodule R M) : Submodule R MThe dual submodule of a submodule with respect to a bilinear form. 
                (innerₗinnerₗ.{u_3} (F : Type u_3) [SeminormedAddCommGroup F] [InnerProductSpace ℝ F] : F →ₗ[ℝ] F →ₗ[ℝ] ℝThe inner product as a bilinear map in the real case.  (EuclideanSpaceEuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     d))) ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d)))),tsum.{u_4, u_5} {α : Type u_4} {β : Type u_5} [AddCommMonoid α] [TopologicalSpace α] (f : β → α)
      (L : SummationFilter β := SummationFilter.unconditional β) : α`∑' i, f i` is the unconditional sum of `f` if it exists, or 0 otherwise.
    
    More generally, if `L` is a `SummationFilter`, `∑'[L] i, f i` is the sum of `f` with respect to
    `L` if it exists, and `0` otherwise.
    
    (Note that even if the unconditional sum exists, it might not be unique if the topology is not
    separated. When the support of `f` is finite, we make the most reasonable choice, to use the sum
    over the support. Otherwise, we choose arbitrarily an `a` satisfying `HasSum f a`. Similar remarks
    apply to more general summation filters.)
    
            FourierTransform.fourierFourierTransform.fourier.{u, v} {E : Type u} {F : outParam (Type v)} [self : FourierTransform E F] : E → F`𝓕 f` is the Fourier transform of `f`. The meaning of this notation is type-dependent.  fSchwartzMap (EuclideanSpace ℝ (Fin d)) ℂ m↥(LinearMap.BilinForm.dualSubmodule (innerₗ (EuclideanSpace ℝ (Fin d))) Λ) *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
              Complex.expComplex.exp (z : ℂ) : ℂThe complex exponential function, defined via its Taylor series 
                (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.2 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Real.piReal.pi : ℝThe number π = 3.14159265... Defined here using choice as twice a zero of cos in [1,2],
    from which one can derive all its properties. For explicit bounds on π,
    see `Mathlib/Analysis/Real/Pi/Bounds.lean`.
    
    Denoted `π`, once the `Real` namespace is opened.  *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Complex.IComplex.I : ℂThe imaginary unit.  *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
                  (RCLike.wInnerRCLike.wInner.{u_1, u_3, u_4} {ι : Type u_1} {𝕜 : Type u_3} {E : ι → Type u_4} [Fintype ι] [RCLike 𝕜]
      [(i : ι) → SeminormedAddCommGroup (E i)] [(i : ι) → InnerProductSpace 𝕜 (E i)] (w : ι → ℝ) (f g : (i : ι) → E i) : 𝕜Weighted inner product giving rise to the L2 norm, denoted as `⟪g, f⟫_[𝕜, w]`.  1 vEuclideanSpace ℝ (Fin d).ofLpWithLp.ofLp.{u_1} {p : ENNReal} {V : Type u_1} (self : WithLp p V) : VConverts an element of `WithLp p V` to an element of `V`.  (↑m↥(LinearMap.BilinForm.dualSubmodule (innerₗ (EuclideanSpace ℝ (Fin d))) Λ)).ofLpWithLp.ofLp.{u_1} {p : ENNReal} {V : Type u_1} (self : WithLp p V) : VConverts an element of `WithLp p V` to an element of `V`. ))HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
    theorem SchwartzMap.PoissonSummation_Lattices
      {d : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    } [FactFact (p : Prop) : PropWrapper for adding elementary propositions to the type class systems.
    Warning: this can easily be abused. See the rest of this docstring for details.
    
    Certain propositions should not be treated as a class globally,
    but sometimes it is very convenient to be able to use the type class system
    in specific circumstances.
    
    For example, `ZMod p` is a field if and only if `p` is a prime number.
    In order to be able to find this field instance automatically by type class search,
    we have to turn `p.prime` into an instance implicit assumption.
    
    On the other hand, making `Nat.prime` a class would require a major refactoring of the library,
    and it is questionable whether making `Nat.prime` a class is desirable at all.
    The compromise is to add the assumption `[Fact p.prime]` to `ZMod.field`.
    
    In particular, this class is not intended for turning the type class system
    into an automated theorem prover for first-order logic.  (LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`.0 <LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`. d)LT.lt.{u} {α : Type u} [self : LT α] : α → α → PropThe less-than relation: `x < y` 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `<` in identifiers is `lt`.]
      (ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d)) :
        SubmoduleSubmodule.{u, v} (R : Type u) (M : Type v) [Semiring R] [AddCommMonoid M] [Module R M] : Type vA submodule of a module is one which is closed under vector operations.
    This is a sufficient condition for the subset of vectors in the submodule
    to themselves form a module.  Int : TypeThe integers.
    
    This type is special-cased by the compiler and overridden with an efficient implementation. The
    runtime has a special representation for `Int` that stores “small” signed numbers directly, while
    larger numbers use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)). A “small number” is an integer that can be encoded with one fewer bits
    than the platform's pointer size (i.e. 63 bits on 64-bit architectures and 31 bits on 32-bit
    architectures).
    
          (EuclideanSpaceEuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     d)))
      [DiscreteTopologyDiscreteTopology.{u_2} (α : Type u_2) [t : TopologicalSpace α] : PropA topological space is discrete if every set is open, that is,
    its topology equals the discrete topology `⊥`.  ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d))] [IsZLatticeIsZLattice.{u_1, u_2} (K : Type u_1) [NormedField K] {E : Type u_2} [NormedAddCommGroup E] [NormedSpace K E]
      (L : Submodule ℤ E) [DiscreteTopology ↥L] : Prop`L : Submodule ℤ E` where `E` is a vector space over a normed field `K` is a `ℤ`-lattice if
    it is discrete and spans `E` over `K`.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d))]
      (fSchwartzMap (EuclideanSpace ℝ (Fin d)) ℂ :
        SchwartzMapSchwartzMap.{u_5, u_6} (E : Type u_5) (F : Type u_6) [NormedAddCommGroup E] [NormedSpace ℝ E] [NormedAddCommGroup F]
      [NormedSpace ℝ F] : Type (max u_5 u_6)A function is a Schwartz function if it is smooth and all derivatives decay faster than
    any power of `‖x‖`.  (EuclideanSpaceEuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     d))
          Complex : TypeComplex numbers consist of two `Real`s: a real part `re` and an imaginary part `im`. )
      (vEuclideanSpace ℝ (Fin d) : EuclideanSpaceEuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     d)) :
      ∑'tsum.{u_4, u_5} {α : Type u_4} {β : Type u_5} [AddCommMonoid α] [TopologicalSpace α] (f : β → α)
      (L : SummationFilter β := SummationFilter.unconditional β) : α`∑' i, f i` is the unconditional sum of `f` if it exists, or 0 otherwise.
    
    More generally, if `L` is a `SummationFilter`, `∑'[L] i, f i` is the sum of `f` with respect to
    `L` if it exists, and `0` otherwise.
    
    (Note that even if the unconditional sum exists, it might not be unique if the topology is not
    separated. When the support of `f` is finite, we make the most reasonable choice, to use the sum
    over the support. Otherwise, we choose arbitrarily an `a` satisfying `HasSum f a`. Similar remarks
    apply to more general summation filters.)
     (↥Λ : ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d))),tsum.{u_4, u_5} {α : Type u_4} {β : Type u_5} [AddCommMonoid α] [TopologicalSpace α] (f : β → α)
      (L : SummationFilter β := SummationFilter.unconditional β) : α`∑' i, f i` is the unconditional sum of `f` if it exists, or 0 otherwise.
    
    More generally, if `L` is a `SummationFilter`, `∑'[L] i, f i` is the sum of `f` with respect to
    `L` if it exists, and `0` otherwise.
    
    (Note that even if the unconditional sum exists, it might not be unique if the topology is not
    separated. When the support of `f` is finite, we make the most reasonable choice, to use the sum
    over the support. Otherwise, we choose arbitrarily an `a` satisfying `HasSum f a`. Similar remarks
    apply to more general summation filters.)
     fSchwartzMap (EuclideanSpace ℝ (Fin d)) ℂ (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.vEuclideanSpace ℝ (Fin d) +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. ↥Λ)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        1 /HDiv.hDiv.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HDiv α β γ] : α → β → γ`a / b` computes the result of dividing `a` by `b`.
    The meaning of this notation is type-dependent.
    * For most types like `Nat`, `Int`, `Rat`, `Real`, `a / 0` is defined to be `0`.
    * For `Nat`, `a / b` rounds downwards.
    * For `Int`, `a / b` rounds downwards if `b` is positive or upwards if `b` is negative.
      It is implemented as `Int.ediv`, the unique function satisfying
      `a % b + b * (a / b) = a` and `0 ≤ a % b < natAbs b` for `b ≠ 0`.
      Other rounding conventions are available using the functions
      `Int.fdiv` (floor rounding) and `Int.tdiv` (truncation rounding).
    * For `Float`, `a / 0` follows the IEEE 754 semantics for division,
      usually resulting in `inf` or `nan`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `/` in identifiers is `div`.
            (ZLattice.covolumeZLattice.covolume.{u_1} {E : Type u_1} [NormedAddCommGroup E] [MeasurableSpace E] (L : Submodule ℤ E)
      (μ : MeasureTheory.Measure E := by volume_tac) : ℝThe covolume of a `ℤ`-lattice is the volume of some fundamental domain; see
    `ZLattice.covolume_eq_volume` for the proof that the volume does not depend on the choice of
    the fundamental domain.  ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d))
                MeasureTheory.volumeMeasureTheory.MeasureSpace.volume.{u_6} {α : Type u_6} [self : MeasureTheory.MeasureSpace α] : MeasureTheory.Measure α`volume` is the canonical measure on `α`. ) *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
          ∑'tsum.{u_4, u_5} {α : Type u_4} {β : Type u_5} [AddCommMonoid α] [TopologicalSpace α] (f : β → α)
      (L : SummationFilter β := SummationFilter.unconditional β) : α`∑' i, f i` is the unconditional sum of `f` if it exists, or 0 otherwise.
    
    More generally, if `L` is a `SummationFilter`, `∑'[L] i, f i` is the sum of `f` with respect to
    `L` if it exists, and `0` otherwise.
    
    (Note that even if the unconditional sum exists, it might not be unique if the topology is not
    separated. When the support of `f` is finite, we make the most reasonable choice, to use the sum
    over the support. Otherwise, we choose arbitrarily an `a` satisfying `HasSum f a`. Similar remarks
    apply to more general summation filters.)
     (m↥(LinearMap.BilinForm.dualSubmodule (innerₗ (EuclideanSpace ℝ (Fin d))) Λ) :
            (LinearMap.BilinForm.dualSubmoduleLinearMap.BilinForm.dualSubmodule.{u_1, u_2, u_3} {R : Type u_1} {S : Type u_2} {M : Type u_3} [CommRing R] [Field S]
      [AddCommGroup M] [Algebra R S] [Module R M] [Module S M] [IsScalarTower R S M] (B : LinearMap.BilinForm S M)
      (N : Submodule R M) : Submodule R MThe dual submodule of a submodule with respect to a bilinear form. 
                (innerₗinnerₗ.{u_3} (F : Type u_3) [SeminormedAddCommGroup F] [InnerProductSpace ℝ F] : F →ₗ[ℝ] F →ₗ[ℝ] ℝThe inner product as a bilinear map in the real case. 
                  (EuclideanSpaceEuclideanSpace.{u_7, u_8} (𝕜 : Type u_7) (n : Type u_8) : Type (max u_7 u_8)The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
    space use `EuclideanSpace 𝕜 (Fin n)`.
    
    For the case when `n = Fin _`, there is `!₂[x, y, ...]` notation for building elements of this type,
    analogous to `![x, y, ...]` notation.  Real : TypeThe type `ℝ` of real numbers constructed as equivalence classes of Cauchy sequences of rational
    numbers.  (FinFin (n : ℕ) : TypeNatural numbers less than some upper bound.
    
    In particular, a `Fin n` is a natural number `i` with the constraint that `i < n`. It is the
    canonical type with `n` elements.
     d)))
                ΛSubmodule ℤ (EuclideanSpace ℝ (Fin d)))),tsum.{u_4, u_5} {α : Type u_4} {β : Type u_5} [AddCommMonoid α] [TopologicalSpace α] (f : β → α)
      (L : SummationFilter β := SummationFilter.unconditional β) : α`∑' i, f i` is the unconditional sum of `f` if it exists, or 0 otherwise.
    
    More generally, if `L` is a `SummationFilter`, `∑'[L] i, f i` is the sum of `f` with respect to
    `L` if it exists, and `0` otherwise.
    
    (Note that even if the unconditional sum exists, it might not be unique if the topology is not
    separated. When the support of `f` is finite, we make the most reasonable choice, to use the sum
    over the support. Otherwise, we choose arbitrarily an `a` satisfying `HasSum f a`. Similar remarks
    apply to more general summation filters.)
    
            FourierTransform.fourierFourierTransform.fourier.{u, v} {E : Type u} {F : outParam (Type v)} [self : FourierTransform E F] : E → F`𝓕 f` is the Fourier transform of `f`. The meaning of this notation is type-dependent.  fSchwartzMap (EuclideanSpace ℝ (Fin d)) ℂ m↥(LinearMap.BilinForm.dualSubmodule (innerₗ (EuclideanSpace ℝ (Fin d))) Λ) *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
              Complex.expComplex.exp (z : ℂ) : ℂThe complex exponential function, defined via its Taylor series 
                (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.2 *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Real.piReal.pi : ℝThe number π = 3.14159265... Defined here using choice as twice a zero of cos in [1,2],
    from which one can derive all its properties. For explicit bounds on π,
    see `Mathlib/Analysis/Real/Pi/Bounds.lean`.
    
    Denoted `π`, once the `Real` namespace is opened.  *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Complex.IComplex.I : ℂThe imaginary unit.  *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
                  (RCLike.wInnerRCLike.wInner.{u_1, u_3, u_4} {ι : Type u_1} {𝕜 : Type u_3} {E : ι → Type u_4} [Fintype ι] [RCLike 𝕜]
      [(i : ι) → SeminormedAddCommGroup (E i)] [(i : ι) → InnerProductSpace 𝕜 (E i)] (w : ι → ℝ) (f g : (i : ι) → E i) : 𝕜Weighted inner product giving rise to the L2 norm, denoted as `⟪g, f⟫_[𝕜, w]`.  1 vEuclideanSpace ℝ (Fin d).ofLpWithLp.ofLp.{u_1} {p : ENNReal} {V : Type u_1} (self : WithLp p V) : VConverts an element of `WithLp p V` to an element of `V`. 
                      (↑m↥(LinearMap.BilinForm.dualSubmodule (innerₗ (EuclideanSpace ℝ (Fin d))) Λ)).ofLpWithLp.ofLp.{u_1} {p : ENNReal} {V : Type u_1} (self : WithLp p V) : VConverts an element of `WithLp p V` to an element of `V`. ))HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
    contains sorry in proof
Proof

One possible proof would be by induction on d. However, there are numerous nuances involved, particularly in manipulating nested infinite sums. Ideas would be appreciated.

While the Poisson summation formula over lattices can be stated in greater generality and probably should be formalised as such in Mathlib due to its many applications, we stick with Schwartz functions because that should be sufficient for our purposes.

Theorem5.8
Group: Summability lemmas and Poisson summation over lattices. (3)
Hover another entry in this group to preview it.
XL∃∀N
Used by 2
Hover a use site to preview it.
Preview
Lemma 8.11
Loading preview
Hover a use site to preview it.

Assume f : \R \to \C is smooth on [0, \infty) and for all k, n \in \N there exists C \in \R such that x^{\frac{k}{2}} \cdot |f^{(n)}(x)| \leq C. Then, for all d \in \N, the function f_d : \R^d \to \C, \quad f_d(x) := f(\|x\|^2) is a Schwartz function.