Lean Ridgelet Blueprint

5.5. Mathlib candidates: finite Fourier and Euclidean geometry🔗

Finite Fourier inversion, the higher-codimension d-plane transform, diagonal changes of variables, and a triple-integral Fubini bridge.

Finite Fourier analysis

Theorem5.5.1
uses 0used by 1L∃∀N

The discrete Fourier transform on a product of cyclic groups. Mathlib's ZMod.dft covers a single cyclic group ZMod N together with its inversion formula, but neither the transform on \iota\to\mathbb Z/N\mathbb Z with the dot-product pairing, which is what one needs whenever (\mathbb Z/N\mathbb Z)^m stands in for a discretized Euclidean space, nor a convolution theorem for the one-dimensional transform. Both are proved here. Everything rests on orthogonality of characters on a product, \sum_{\xi}\mathrm e(\xi\cdot t)=\begin{cases}N^{|\iota|}&t=0\\0&t\neq0,\end{cases} which follows by factoring the character of a dot product over the coordinates — an additive character carries a finite sum to a finite product, the first declaration — and reducing to the one-dimensional statement, itself the public form of a computation Mathlib currently performs inline inside a private proof. Inversion is stated as \sum_\xi\mathrm e(\xi\cdot x)\widehat f(\xi)=N^{|\iota|}f(x), avoiding division. The convolution theorem takes the matching form \sum_\omega\widehat u(\omega)\widehat v(\omega)\mathrm e(\omega t)=N\sum_bu(b)v(t-b). Along the way the standard character is recorded as unimodular, so that conjugating it negates its argument.

Lean code for Theorem5.5.110 declarations
  • complete
    theorem AddChar.map_finsetSum.{u_1, u_2, u_3} {ι : Type u_1} {A : Type u_2}
      {M : Type u_3} [AddCommMonoid A] [CommMonoid M] (ψ : AddChar A M)
      (s : Finset ι) (f : ι  A) : ψ (∑ i  s, f i) =  i  s, ψ (f i)
    theorem AddChar.map_finsetSum.{u_1, u_2, u_3}
      {ι : Type u_1} {A : Type u_2}
      {M : Type u_3} [AddCommMonoid A]
      [CommMonoid M] (ψ : AddChar A M)
      (s : Finset ι) (f : ι  A) :
      ψ (∑ i  s, f i) =  i  s, ψ (f i)
    An additive character carries a finite sum to a finite product. The two-term case is
    `AddChar.map_add_eq_mul`. 
  • complete
    theorem ZMod.sum_stdAddChar_mul {N : } [NeZero N] (t : ZMod N) :
       c, ZMod.stdAddChar (c * t) = if t = 0 then N else 0
    theorem ZMod.sum_stdAddChar_mul {N : } [NeZero N]
      (t : ZMod N) :
       c, ZMod.stdAddChar (c * t) =
        if t = 0 then N else 0
    Orthogonality of the standard additive character on `ZMod N`: summing `e(c t)` over `c`
    gives `N` at `t = 0` and cancels otherwise. 
  • complete
    theorem ZMod.norm_stdAddChar {N : } [NeZero N] (z : ZMod N) :
      ZMod.stdAddChar z = 1
    theorem ZMod.norm_stdAddChar {N : } [NeZero N]
      (z : ZMod N) : ZMod.stdAddChar z = 1
    The standard additive character takes values on the unit circle. 
  • complete
    theorem ZMod.conj_stdAddChar {N : } [NeZero N] (z : ZMod N) :
      (starRingEnd ) (ZMod.stdAddChar z) = ZMod.stdAddChar (-z)
    theorem ZMod.conj_stdAddChar {N : } [NeZero N]
      (z : ZMod N) :
      (starRingEnd ) (ZMod.stdAddChar z) =
        ZMod.stdAddChar (-z)
    Conjugating the standard additive character negates its argument. 
  • complete
    theorem ZMod.sum_dft_mul_dft_mul_stdAddChar {N : } [NeZero N]
      (u v : ZMod N  ) (t : ZMod N) :
       ω, ZMod.dft u ω * ZMod.dft v ω * ZMod.stdAddChar (ω * t) =
        N *  b, u b * v (t - b)
    theorem ZMod.sum_dft_mul_dft_mul_stdAddChar
      {N : } [NeZero N] (u v : ZMod N  )
      (t : ZMod N) :
       ω,
          ZMod.dft u ω * ZMod.dft v ω *
            ZMod.stdAddChar (ω * t) =
        N *  b, u b * v (t - b)
    **Convolution theorem on `ZMod N`**, in the inverted form that avoids dividing: the inverse
    transform of the product `û v̂` is `N` times the cyclic convolution of `u` and `v`. Mathlib has
    `ZMod.dft` and its inversion formula but no convolution theorem for it. 
  • def ZMod.piDFT.{u_1, u_2} {N : } [NeZero N] {ι : Type u_1} [Fintype ι]
      [DecidableEq ι] {E : Type u_2} [AddCommGroup E] [Module  E]
      (f : (ι  ZMod N)  E) (ξ : ι  ZMod N) : E
    def ZMod.piDFT.{u_1, u_2} {N : } [NeZero N]
      {ι : Type u_1} [Fintype ι]
      [DecidableEq ι] {E : Type u_2}
      [AddCommGroup E] [Module  E]
      (f : (ι  ZMod N)  E)
      (ξ : ι  ZMod N) : E
    Implementation after :=
    :=
      ∑ x : ι → ZMod N, stdAddChar (-(ξ ⬝ᵥ x)) • f x
    The discrete Fourier transform on `ι → ZMod N` with the dot-product pairing:
    `f̂(ξ) = ∑ₓ e(-ξ·x) f(x)`, the `|ι|`-dimensional counterpart of `ZMod.dft`. 
  • complete
    theorem ZMod.piDFT_apply_zero.{u_1, u_2} {N : } [NeZero N] {ι : Type u_1}
      [Fintype ι] [DecidableEq ι] {E : Type u_2} [AddCommGroup E]
      [Module  E] (f : (ι  ZMod N)  E) : ZMod.piDFT f 0 =  x, f x
    theorem ZMod.piDFT_apply_zero.{u_1, u_2} {N : }
      [NeZero N] {ι : Type u_1} [Fintype ι]
      [DecidableEq ι] {E : Type u_2}
      [AddCommGroup E] [Module  E]
      (f : (ι  ZMod N)  E) :
      ZMod.piDFT f 0 =  x, f x
    The zero frequency of the transform is the total sum. 
  • complete
    theorem ZMod.sum_stdAddChar_dotProduct.{u_1} {N : } [NeZero N] {ι : Type u_1}
      [Fintype ι] [DecidableEq ι] (t : ι  ZMod N) :
       ξ, ZMod.stdAddChar (ξ ⬝ᵥ t) =
        if t = 0 then N ^ Fintype.card ι else 0
    theorem ZMod.sum_stdAddChar_dotProduct.{u_1}
      {N : } [NeZero N] {ι : Type u_1}
      [Fintype ι] [DecidableEq ι]
      (t : ι  ZMod N) :
       ξ, ZMod.stdAddChar (ξ ⬝ᵥ t) =
        if t = 0 then N ^ Fintype.card ι
        else 0
    Orthogonality of characters on `ι → ZMod N`. Factoring `e(ξ·t)` over the coordinates turns
    the sum into a product of one-dimensional sums, each given by `ZMod.sum_stdAddChar_mul`. 
  • complete
    theorem ZMod.sum_stdAddChar_smul_piDFT.{u_1, u_2} {N : } [NeZero N]
      {ι : Type u_1} [Fintype ι] [DecidableEq ι] {E : Type u_2}
      [AddCommGroup E] [Module  E] (f : (ι  ZMod N)  E)
      (x : ι  ZMod N) :
       ξ, ZMod.stdAddChar (ξ ⬝ᵥ x)  ZMod.piDFT f ξ =
        N ^ Fintype.card ι  f x
    theorem ZMod.sum_stdAddChar_smul_piDFT.{u_1, u_2}
      {N : } [NeZero N] {ι : Type u_1}
      [Fintype ι] [DecidableEq ι]
      {E : Type u_2} [AddCommGroup E]
      [Module  E] (f : (ι  ZMod N)  E)
      (x : ι  ZMod N) :
       ξ,
          ZMod.stdAddChar (ξ ⬝ᵥ x) 
            ZMod.piDFT f ξ =
        N ^ Fintype.card ι  f x
    Fourier inversion on `ι → ZMod N`, in the form that avoids dividing:
    `∑_ξ e(ξ·x) f̂(ξ) = N^{|ι|} • f(x)`. 
  • complete
    theorem ZMod.piDFT_inversion.{u_1, u_2} {N : } [NeZero N] {ι : Type u_1}
      [Fintype ι] [DecidableEq ι] {E : Type u_2} [AddCommGroup E]
      [Module  E] (f : (ι  ZMod N)  E) (x : ι  ZMod N) :
      f x =
        (N ^ Fintype.card ι)⁻¹ 
           ξ, ZMod.stdAddChar (ξ ⬝ᵥ x)  ZMod.piDFT f ξ
    theorem ZMod.piDFT_inversion.{u_1, u_2} {N : }
      [NeZero N] {ι : Type u_1} [Fintype ι]
      [DecidableEq ι] {E : Type u_2}
      [AddCommGroup E] [Module  E]
      (f : (ι  ZMod N)  E)
      (x : ι  ZMod N) :
      f x =
        (N ^ Fintype.card ι)⁻¹ 
           ξ,
            ZMod.stdAddChar (ξ ⬝ᵥ x) 
              ZMod.piDFT f ξ
    Fourier inversion in the form solved for `f`. 
Theorem5.5.2
Statement uses 2
Statement dependency previews
Preview
Definition 5.2.1
Loading preview
Statement dependency preview content is loaded from the rendered-fragment cache.
Used by 5
Reverse dependency previews
Preview
Definition 3.1.16
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
L∃∀N

The d-plane transform and its Fourier slice theorem. The d-plane transform integrates over a d-dimensional affine subspace, parametrized by an orthonormal k-frame presented as a linear isometry L:\mathbb R^k\to E with k=m-d: P_d[f](L,\boldsymbol b)=\int_{(\operatorname{range}L)^\perp}f(L\boldsymbol b+y)\,\mathrm dy. At k=1 it is the Radon transform above — a codimension-one frame is a unit vector, its range is the line through that vector, and the last declaration is the resulting identity dPlaneTransform f L b = radonTransform f (L e₀) (b 0) — and at k=m-1 it is the X-ray transform; Mathlib has neither it nor its slice theorem in any codimension. Both are proved here exactly as in the k=1 case: the parametrization (\boldsymbol b,y)\mapsto L\boldsymbol b+y of E by the range of the frame and its orthogonal complement is a linear isometry equivalence, hence measure preserving, and the rest is Fubini. The theory and the Fubini corollary \int P_d[f](L,\boldsymbol b)\,\mathrm d\boldsymbol b=\int f come with it, and the Fourier slice theorem reads \mathcal Ff(L\boldsymbol\omega)=\mathcal F\bigl(P_d[f](L,\cdot)\bigr)(\boldsymbol\omega). It needs no measure on the space of frames, being a statement at a fixed frame; an invariant measure on the Stiefel manifold is needed only for the inversion formula.

Lean code for Theorem5.5.223 declarations
  • def MeasureTheory.planeOrthogonalSplit.{u_1} {k : } {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E] [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E]
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E) :
      EuclideanSpace  (Fin k) × L.range ≃ᵐ E
    def MeasureTheory.planeOrthogonalSplit.{u_1}
      {k : } {E : Type u_1}
      [NormedAddCommGroup E]
      [InnerProductSpace  E]
      [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E]
      (L :
        EuclideanSpace  (Fin k) →ₗᵢ[] E) :
      EuclideanSpace  (Fin k) × L.range ≃ᵐ
        E
    Implementation after :=
    :=
      (MeasurableEquiv.toLp 2 (EuclideanSpace ℝ (Fin k) ×
          ((LinearMap.range L.toLinearMap)ᗮ : Submodule ℝ E))).trans
        (((LinearIsometryEquiv.withLpProdCongr 2 L.equivRange
            (LinearIsometryEquiv.refl ℝ ((LinearMap.range L.toLinearMap)ᗮ : Submodule ℝ E))).trans
          (LinearMap.range L.toLinearMap).orthogonalDecomposition.symm).toMeasurableEquiv)
    The parametrization `(b, y) ↦ L b + y` of `E` by the range of the frame `L` and its orthogonal
    complement, as a measurable equivalence. For `k = 1` this is
    `MeasureTheory.lineOrthogonalSplit`. 
  • complete
    theorem MeasureTheory.measurePreserving_planeOrthogonalSplit.{u_1} {k : }
      {E : Type u_1} [NormedAddCommGroup E] [InnerProductSpace  E]
      [FiniteDimensional  E] [MeasurableSpace E] [BorelSpace E]
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E) :
      MeasureTheory.MeasurePreserving
        (⇑(MeasureTheory.planeOrthogonalSplit L)) MeasureTheory.volume
        MeasureTheory.volume
    theorem MeasureTheory.measurePreserving_planeOrthogonalSplit.{u_1}
      {k : } {E : Type u_1}
      [NormedAddCommGroup E]
      [InnerProductSpace  E]
      [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E]
      (L :
        EuclideanSpace  (Fin k) →ₗᵢ[] E) :
      MeasureTheory.MeasurePreserving
        (⇑(MeasureTheory.planeOrthogonalSplit
            L))
        MeasureTheory.volume
        MeasureTheory.volume
    The plane–complement parametrization preserves Lebesgue measure. 
  • complete
    theorem MeasureTheory.inner_planeOrthogonalSplit.{u_1} {k : } {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E]
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E)
      (b ω : EuclideanSpace  (Fin k)) (y : L.range) :
      inner  (L b + y) (L ω) = inner  b ω
    theorem MeasureTheory.inner_planeOrthogonalSplit.{u_1}
      {k : } {E : Type u_1}
      [NormedAddCommGroup E]
      [InnerProductSpace  E]
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E)
      (b ω : EuclideanSpace  (Fin k))
      (y : L.range) :
      inner  (L b + y) (L ω) = inner  b ω
    Under the splitting, pairing against a vector of the range of `L` only sees the coordinate
    along the frame: `⟪L b + y, L ω⟫ = ⟪b, ω⟫`. 
  • def MeasureTheory.dPlaneTransform.{u_1, u_2} {k : } {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E] [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E] {F : Type u_2}
      [NormedAddCommGroup F] [NormedSpace  F] (f : E  F)
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E)
      (b : EuclideanSpace  (Fin k)) : F
    def MeasureTheory.dPlaneTransform.{u_1, u_2}
      {k : } {E : Type u_1}
      [NormedAddCommGroup E]
      [InnerProductSpace  E]
      [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E]
      {F : Type u_2} [NormedAddCommGroup F]
      [NormedSpace  F] (f : E  F)
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E)
      (b : EuclideanSpace  (Fin k)) : F
    Implementation after :=
    :=
      ∫ y : ((LinearMap.range L.toLinearMap)ᗮ : Submodule ℝ E), f (L b + (y : E))
    The `d`-plane transform `P_d[f](L, b) = ∫_{(range L)ᗮ} f (L b + y) dy`, the integral of `f`
    over the `d`-plane through `L b` parallel to the orthogonal complement of the frame. 
  • complete
    theorem MeasureTheory.integrable_comp_planeOrthogonalSplit.{u_1, u_2} {k : }
      {E : Type u_1} [NormedAddCommGroup E] [InnerProductSpace  E]
      [FiniteDimensional  E] [MeasurableSpace E] [BorelSpace E]
      {F : Type u_2} [NormedAddCommGroup F] {f : E  F}
      (hf : MeasureTheory.Integrable f MeasureTheory.volume)
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E) :
      MeasureTheory.Integrable (fun by_  f (L by_.1 + by_.2))
        MeasureTheory.volume
    theorem MeasureTheory.integrable_comp_planeOrthogonalSplit.{u_1,
        u_2}
      {k : } {E : Type u_1}
      [NormedAddCommGroup E]
      [InnerProductSpace  E]
      [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E]
      {F : Type u_2} [NormedAddCommGroup F]
      {f : E  F}
      (hf :
        MeasureTheory.Integrable f
          MeasureTheory.volume)
      (L :
        EuclideanSpace  (Fin k) →ₗᵢ[] E) :
      MeasureTheory.Integrable
        (fun by_  f (L by_.1 + by_.2))
        MeasureTheory.volume
    Transport of integrability through the plane–complement parametrization. 
  • complete
    theorem MeasureTheory.ae_integrable_dPlaneTransform_section.{u_1, u_2} {k : }
      {E : Type u_1} [NormedAddCommGroup E] [InnerProductSpace  E]
      [FiniteDimensional  E] [MeasurableSpace E] [BorelSpace E]
      {F : Type u_2} [NormedAddCommGroup F] {f : E  F}
      (hf : MeasureTheory.Integrable f MeasureTheory.volume)
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E) :
      ∀ᵐ (b : EuclideanSpace  (Fin k)),
        MeasureTheory.Integrable (fun y  f (L b + y)) MeasureTheory.volume
    theorem MeasureTheory.ae_integrable_dPlaneTransform_section.{u_1,
        u_2}
      {k : } {E : Type u_1}
      [NormedAddCommGroup E]
      [InnerProductSpace  E]
      [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E]
      {F : Type u_2} [NormedAddCommGroup F]
      {f : E  F}
      (hf :
        MeasureTheory.Integrable f
          MeasureTheory.volume)
      (L :
        EuclideanSpace  (Fin k) →ₗᵢ[] E) :
      ∀ᵐ (b : EuclideanSpace  (Fin k)),
        MeasureTheory.Integrable
          (fun y  f (L b + y))
          MeasureTheory.volume
    For integrable `f`, almost every `d`-plane section is integrable, so the transform is an
    absolutely convergent integral at almost every offset. 
  • complete
    theorem MeasureTheory.integrable_dPlaneTransform.{u_1, u_2} {k : }
      {E : Type u_1} [NormedAddCommGroup E] [InnerProductSpace  E]
      [FiniteDimensional  E] [MeasurableSpace E] [BorelSpace E]
      {F : Type u_2} [NormedAddCommGroup F] [NormedSpace  F] {f : E  F}
      (hf : MeasureTheory.Integrable f MeasureTheory.volume)
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E) :
      MeasureTheory.Integrable (MeasureTheory.dPlaneTransform f L)
        MeasureTheory.volume
    theorem MeasureTheory.integrable_dPlaneTransform.{u_1,
        u_2}
      {k : } {E : Type u_1}
      [NormedAddCommGroup E]
      [InnerProductSpace  E]
      [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E]
      {F : Type u_2} [NormedAddCommGroup F]
      [NormedSpace  F] {f : E  F}
      (hf :
        MeasureTheory.Integrable f
          MeasureTheory.volume)
      (L :
        EuclideanSpace  (Fin k) →ₗᵢ[] E) :
      MeasureTheory.Integrable
        (MeasureTheory.dPlaneTransform f L)
        MeasureTheory.volume
    The `d`-plane transform of an integrable function is integrable in the offset. 
  • complete
    theorem MeasureTheory.integral_dPlaneTransform.{u_1, u_2} {k : } {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E] [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E] {F : Type u_2}
      [NormedAddCommGroup F] [NormedSpace  F] {f : E  F}
      (hf : MeasureTheory.Integrable f MeasureTheory.volume)
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E) :
       (b : EuclideanSpace  (Fin k)),
          MeasureTheory.dPlaneTransform f L b =
         (x : E), f x
    theorem MeasureTheory.integral_dPlaneTransform.{u_1,
        u_2}
      {k : } {E : Type u_1}
      [NormedAddCommGroup E]
      [InnerProductSpace  E]
      [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E]
      {F : Type u_2} [NormedAddCommGroup F]
      [NormedSpace  F] {f : E  F}
      (hf :
        MeasureTheory.Integrable f
          MeasureTheory.volume)
      (L :
        EuclideanSpace  (Fin k) →ₗᵢ[] E) :
       (b : EuclideanSpace  (Fin k)),
          MeasureTheory.dPlaneTransform f L
            b =
         (x : E), f x
    The Fubini corollary `∫ b, P_d[f](L, b) db = ∫ x, f x dx`. 
  • complete
    theorem MeasureTheory.fourier_slice_dPlaneTransform.{u_1, u_3} {k : }
      {E : Type u_1} [NormedAddCommGroup E] [InnerProductSpace  E]
      [FiniteDimensional  E] [MeasurableSpace E] [BorelSpace E]
      {F' : Type u_3} [NormedAddCommGroup F'] [NormedSpace  F']
      {f : E  F'} (hf : MeasureTheory.Integrable f MeasureTheory.volume)
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E)
      (ω : EuclideanSpace  (Fin k)) :
      FourierTransform.fourier f (L ω) =
        FourierTransform.fourier (MeasureTheory.dPlaneTransform f L) ω
    theorem MeasureTheory.fourier_slice_dPlaneTransform.{u_1,
        u_3}
      {k : } {E : Type u_1}
      [NormedAddCommGroup E]
      [InnerProductSpace  E]
      [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E]
      {F' : Type u_3} [NormedAddCommGroup F']
      [NormedSpace  F'] {f : E  F'}
      (hf :
        MeasureTheory.Integrable f
          MeasureTheory.volume)
      (L : EuclideanSpace  (Fin k) →ₗᵢ[] E)
      (ω : EuclideanSpace  (Fin k)) :
      FourierTransform.fourier f (L ω) =
        FourierTransform.fourier
          (MeasureTheory.dPlaneTransform f L)
          ω
    **Fourier slice theorem for the `d`-plane transform** (the projection-slice theorem in
    codimension `k`): the `k`-dimensional Fourier transform of the transform in the offset is the
    `m`-dimensional Fourier transform of `f` restricted to the range of the frame,
    `𝓕 f (L ω) = 𝓕(P_d[f](L,·))(ω)`. For `k = 1` this is
    `MeasureTheory.fourier_slice_radonTransform`. 
  • def MeasureTheory.frameVectorCodimOne.{u_1} {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E]
      (L : EuclideanSpace  (Fin 1) →ₗᵢ[] E) : E
    def MeasureTheory.frameVectorCodimOne.{u_1}
      {E : Type u_1} [NormedAddCommGroup E]
      [InnerProductSpace  E]
      (L :
        EuclideanSpace  (Fin 1) →ₗᵢ[] E) :
      E
    Implementation after :=
    :=
      L (EuclideanSpace.single (0 : Fin 1) (1 : ℝ))
    The unit vector that a codimension-one frame is: an orthonormal `1`-frame in `E` is a unit
    vector, namely the image of the standard basis vector of `ℝ^1`. 
  • complete
    theorem MeasureTheory.norm_frameVectorCodimOne.{u_1} {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E]
      (L : EuclideanSpace  (Fin 1) →ₗᵢ[] E) :
      MeasureTheory.frameVectorCodimOne L = 1
    theorem MeasureTheory.norm_frameVectorCodimOne.{u_1}
      {E : Type u_1} [NormedAddCommGroup E]
      [InnerProductSpace  E]
      (L :
        EuclideanSpace  (Fin 1) →ₗᵢ[] E) :
      MeasureTheory.frameVectorCodimOne L =
        1
  • complete
    theorem MeasureTheory.eq_smul_single_fin_one (b : EuclideanSpace  (Fin 1)) :
      b = b.ofLp 0  EuclideanSpace.single 0 1
    theorem MeasureTheory.eq_smul_single_fin_one
      (b : EuclideanSpace  (Fin 1)) :
      b = b.ofLp 0  EuclideanSpace.single 0 1
    A vector of `ℝ^1` is its only coordinate times the standard basis vector. 
  • complete
    theorem MeasureTheory.apply_eq_smul_frameVectorCodimOne.{u_1} {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E]
      (L : EuclideanSpace  (Fin 1) →ₗᵢ[] E)
      (b : EuclideanSpace  (Fin 1)) :
      L b = b.ofLp 0  MeasureTheory.frameVectorCodimOne L
    theorem MeasureTheory.apply_eq_smul_frameVectorCodimOne.{u_1}
      {E : Type u_1} [NormedAddCommGroup E]
      [InnerProductSpace  E]
      (L : EuclideanSpace  (Fin 1) →ₗᵢ[] E)
      (b : EuclideanSpace  (Fin 1)) :
      L b =
        b.ofLp 0 
          MeasureTheory.frameVectorCodimOne L
    A codimension-one frame acts by scaling its unit vector. 
  • complete
    theorem MeasureTheory.range_eq_span_frameVectorCodimOne.{u_1} {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E]
      (L : EuclideanSpace  (Fin 1) →ₗᵢ[] E) :
      L.range =   MeasureTheory.frameVectorCodimOne L
    theorem MeasureTheory.range_eq_span_frameVectorCodimOne.{u_1}
      {E : Type u_1} [NormedAddCommGroup E]
      [InnerProductSpace  E]
      (L :
        EuclideanSpace  (Fin 1) →ₗᵢ[] E) :
      L.range =
         
          MeasureTheory.frameVectorCodimOne L
    The `d`-plane of a codimension-one frame is a hyperplane: the range of the frame is the line
    through its unit vector. 
  • complete
    theorem MeasureTheory.dPlaneTransform_codimOne.{u_1, u_2} {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E] [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E] {F : Type u_2}
      [NormedAddCommGroup F] [NormedSpace  F] (f : E  F)
      (L : EuclideanSpace  (Fin 1) →ₗᵢ[] E)
      (b : EuclideanSpace  (Fin 1)) :
      MeasureTheory.dPlaneTransform f L b =
        MeasureTheory.radonTransform f (MeasureTheory.frameVectorCodimOne L)
          (b.ofLp 0)
    theorem MeasureTheory.dPlaneTransform_codimOne.{u_1,
        u_2}
      {E : Type u_1} [NormedAddCommGroup E]
      [InnerProductSpace  E]
      [FiniteDimensional  E]
      [MeasurableSpace E] [BorelSpace E]
      {F : Type u_2} [NormedAddCommGroup F]
      [NormedSpace  F] (f : E  F)
      (L : EuclideanSpace  (Fin 1) →ₗᵢ[] E)
      (b : EuclideanSpace  (Fin 1)) :
      MeasureTheory.dPlaneTransform f L b =
        MeasureTheory.radonTransform f
          (MeasureTheory.frameVectorCodimOne
            L)
          (b.ofLp 0)
    **At codimension one the `d`-plane transform is the Radon transform.** The frame is a unit
    vector, its range is the line through it, and the `d`-plane is the hyperplane orthogonal to that
    line. So `MeasureTheory.radonTransform` is the `k = 1` case of `MeasureTheory.dPlaneTransform`, as
    is the Fourier slice theorem of each. 
  • complete
    theorem MeasureTheory.norm_eq_abs_apply_fin_one (b : EuclideanSpace  (Fin 1)) :
      b = |b.ofLp 0|
    theorem MeasureTheory.norm_eq_abs_apply_fin_one
      (b : EuclideanSpace  (Fin 1)) :
      b = |b.ofLp 0|
    The norm of a vector of `ℝ^1` is the absolute value of its only coordinate. 
  • def MeasureTheory.frameOfUnitVector.{u_1} {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E]
      (u : (Metric.sphere 0 1)) : EuclideanSpace  (Fin 1) →ₗᵢ[] E
    def MeasureTheory.frameOfUnitVector.{u_1}
      {E : Type u_1} [NormedAddCommGroup E]
      [InnerProductSpace  E]
      (u : (Metric.sphere 0 1)) :
      EuclideanSpace  (Fin 1) →ₗᵢ[] E
    Implementation after :=
    := b 0 • (u : E)
      map_add' b b' := by simp [add_smul]
      map_smul' c b := by simp [mul_smul]
      norm_map' b := by
        simp [norm_smul, mem_sphere_zero_iff_norm.1 u.2, norm_eq_abs_apply_fin_one]
    The codimension-one frame that a unit vector is: the inverse of
    `MeasureTheory.frameVectorCodimOne`, sending `u` to the isometry `b ↦ b 0 • u` of `ℝ^1` into `E`. 
  • complete
    theorem MeasureTheory.frameOfUnitVector_apply.{u_1} {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E]
      (u : (Metric.sphere 0 1)) (b : EuclideanSpace  (Fin 1)) :
      (MeasureTheory.frameOfUnitVector u) b = b.ofLp 0  u
    theorem MeasureTheory.frameOfUnitVector_apply.{u_1}
      {E : Type u_1} [NormedAddCommGroup E]
      [InnerProductSpace  E]
      (u : (Metric.sphere 0 1))
      (b : EuclideanSpace  (Fin 1)) :
      (MeasureTheory.frameOfUnitVector u) b =
        b.ofLp 0  u
  • complete
    theorem MeasureTheory.frameVectorCodimOne_frameOfUnitVector.{u_1} {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E]
      (u : (Metric.sphere 0 1)) :
      MeasureTheory.frameVectorCodimOne
          (MeasureTheory.frameOfUnitVector u) =
        u
    theorem MeasureTheory.frameVectorCodimOne_frameOfUnitVector.{u_1}
      {E : Type u_1} [NormedAddCommGroup E]
      [InnerProductSpace  E]
      (u : (Metric.sphere 0 1)) :
      MeasureTheory.frameVectorCodimOne
          (MeasureTheory.frameOfUnitVector
            u) =
        u
  • complete
    theorem MeasureTheory.frameOfUnitVector_frameVectorCodimOne.{u_1} {E : Type u_1}
      [NormedAddCommGroup E] [InnerProductSpace  E]
      (L : EuclideanSpace  (Fin 1) →ₗᵢ[] E)
      (hL : MeasureTheory.frameVectorCodimOne L = 1) :
      MeasureTheory.frameOfUnitVector
          MeasureTheory.frameVectorCodimOne L,  =
        L
    theorem MeasureTheory.frameOfUnitVector_frameVectorCodimOne.{u_1}
      {E : Type u_1} [NormedAddCommGroup E]
      [InnerProductSpace  E]
      (L : EuclideanSpace  (Fin 1) →ₗᵢ[] E)
      (hL :
        MeasureTheory.frameVectorCodimOne
              L =
          1) :
      MeasureTheory.frameOfUnitVector
          MeasureTheory.frameVectorCodimOne
              L,
             =
        L
    **A codimension-one frame is exactly a unit vector.** Together with
    `MeasureTheory.frameVectorCodimOne_frameOfUnitVector` this identifies the Stiefel manifold
    `V_{m,1}` with the sphere `𝕊^{m-1}`. 
  • def MeasureTheory.unitVectorFinOne : (Metric.sphere 0 1)
    def MeasureTheory.unitVectorFinOne :
      (Metric.sphere 0 1)
    Implementation after :=
    :=
      ⟨EuclideanSpace.single (0 : Fin 1) (1 : ℝ), by
        rw [mem_sphere_zero_iff_norm, PiLp.norm_single, norm_one]⟩
    The unit vector of `ℝ^1` that a codimension-one frame is applied to. 
  • complete
    theorem MeasureTheory.coe_unitVectorFinOne :
      MeasureTheory.unitVectorFinOne = EuclideanSpace.single 0 1
    theorem MeasureTheory.coe_unitVectorFinOne :
      MeasureTheory.unitVectorFinOne =
        EuclideanSpace.single 0 1
  • complete
    theorem MeasureTheory.integral_euclideanSpace_fin_one.{u_3} {G : Type u_3}
      [NormedAddCommGroup G] [NormedSpace  G] (g :   G) :
       (b : EuclideanSpace  (Fin 1)), g (b.ofLp 0) =  (t : ), g t
    theorem MeasureTheory.integral_euclideanSpace_fin_one.{u_3}
      {G : Type u_3} [NormedAddCommGroup G]
      [NormedSpace  G] (g :   G) :
       (b : EuclideanSpace  (Fin 1)),
          g (b.ofLp 0) =
         (t : ), g t
    **Integration over `ℝ^1` is integration over `ℝ`.** The only coordinate is a
    measure-preserving equivalence `ℝ^1 ≃ᵐ ℝ`. 

The identification at k=1 is recorded in both directions: a codimension-one frame is a unit vector, and a unit vector is the frame \boldsymbol b\mapsto b_0\boldsymbol u that scales it. So the Stiefel manifold V_{m,1} is the sphere \mathbb S^{m-1} as a set; that it is the sphere as a measure space is mathlib_stiefel_codim_one. The bias space of a codimension-one frame is \mathbb R^1, and integration over it is integration over \mathbb R — the only coordinate is a measure-preserving equivalence, obtained by composing Mathlib's identification of \mathbb R^1 with \iota\to\mathbb R at |\iota|=1 with the projection out of a singleton product.

Theorem5.5.3
uses 0
Used by 2
Reverse dependency previews
Preview
Theorem 3.1.23
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
L∃∀N

Coordinatewise scaling of \mathbb R^k. Mathlib has the one-dimensional change of variables x\mapsto cx and, at the level of measures, the rescaling of an additive Haar measure by an arbitrary linear map; what is missing is the integral form of the change of variables in all k coordinates at once, \int_{\mathbb R^k}G(w_1d_1,\ldots,w_kd_k)\,\mathrm d\boldsymbol d=\Bigl(\prod_i|w_i|\Bigr)^{-1}\int_{\mathbb R^k}G(\boldsymbol y)\,\mathrm d\boldsymbol y. That is what a k-fold scale parameter produces — the diagonal factor of a singular value decomposition, where the k singular values are traded against the k coordinates of a frequency. The proof composes the two facts above: the diagonal map is a linear equivalence when no entry vanishes, its determinant is \prod_iw_i, and the Haar rescaling transports the integral. There is no hypothesis on the integrand, the substitution being along a measurable equivalence.

Lean code for Theorem5.5.37 declarations
  • def MeasureTheory.diagScale {k : } (w : Fin k  ) :
      EuclideanSpace  (Fin k) →ₗ[] EuclideanSpace  (Fin k)
    def MeasureTheory.diagScale {k : }
      (w : Fin k  ) :
      EuclideanSpace  (Fin k) →ₗ[]
        EuclideanSpace  (Fin k)
    Implementation after :=
    := WithLp.toLp 2 fun i => w i * d i
      map_add' d d' := by
        ext i
        simp [mul_add]
      map_smul' c d := by
        ext i
        simp [mul_left_comm]
    Coordinatewise scaling of `ℝ^k`: the diagonal linear map with entries `w`. 
  • complete
    theorem MeasureTheory.diagScale_apply {k : } (w : Fin k  )
      (d : EuclideanSpace  (Fin k)) (i : Fin k) :
      ((MeasureTheory.diagScale w) d).ofLp i = w i * d.ofLp i
    theorem MeasureTheory.diagScale_apply {k : }
      (w : Fin k  )
      (d : EuclideanSpace  (Fin k))
      (i : Fin k) :
      ((MeasureTheory.diagScale w) d).ofLp i =
        w i * d.ofLp i
  • complete
    theorem MeasureTheory.det_diagScale {k : } (w : Fin k  ) :
      LinearMap.det (MeasureTheory.diagScale w) =  i, w i
    theorem MeasureTheory.det_diagScale {k : }
      (w : Fin k  ) :
      LinearMap.det
          (MeasureTheory.diagScale w) =
         i, w i
    The determinant of a coordinatewise scaling is the product of its entries. 
  • def MeasureTheory.diagScaleEquiv {k : } {w : Fin k  }
      (hw :  (i : Fin k), w i  0) :
      EuclideanSpace  (Fin k) ≃ₗ[] EuclideanSpace  (Fin k)
    def MeasureTheory.diagScaleEquiv {k : }
      {w : Fin k  }
      (hw :  (i : Fin k), w i  0) :
      EuclideanSpace  (Fin k) ≃ₗ[]
        EuclideanSpace  (Fin k)
    Implementation after :=
    := diagScale w
      invFun v := WithLp.toLp 2 fun i => (w i)⁻¹ * v i
      left_inv d := by
        ext i
        simp [inv_mul_cancel_left₀ (hw i)]
      right_inv v := by
        ext i
        simp [mul_inv_cancel_left₀ (hw i)]
    Coordinatewise scaling as a linear equivalence, available when no coordinate vanishes. 
  • def MeasureTheory.diagScaleMeasurableEquiv {k : } {w : Fin k  }
      (hw :  (i : Fin k), w i  0) :
      EuclideanSpace  (Fin k) ≃ᵐ EuclideanSpace  (Fin k)
    def MeasureTheory.diagScaleMeasurableEquiv
      {k : } {w : Fin k  }
      (hw :  (i : Fin k), w i  0) :
      EuclideanSpace  (Fin k) ≃ᵐ
        EuclideanSpace  (Fin k)
    Implementation after :=
    :=
      (diagScaleEquiv hw).toContinuousLinearEquiv.toHomeomorph.toMeasurableEquiv
    Coordinatewise scaling as a measurable equivalence. 
  • complete
    theorem MeasureTheory.coe_diagScaleMeasurableEquiv {k : } {w : Fin k  }
      (hw :  (i : Fin k), w i  0) (d : EuclideanSpace  (Fin k)) :
      (MeasureTheory.diagScaleMeasurableEquiv hw) d =
        (MeasureTheory.diagScale w) d
    theorem MeasureTheory.coe_diagScaleMeasurableEquiv
      {k : } {w : Fin k  }
      (hw :  (i : Fin k), w i  0)
      (d : EuclideanSpace  (Fin k)) :
      (MeasureTheory.diagScaleMeasurableEquiv
            hw)
          d =
        (MeasureTheory.diagScale w) d
  • complete
    theorem MeasureTheory.integral_comp_diagScale.{u_1} {k : } {G : Type u_1}
      [NormedAddCommGroup G] [NormedSpace  G] {w : Fin k  }
      (hw :  (i : Fin k), w i  0) (G' : EuclideanSpace  (Fin k)  G) :
       (d : EuclideanSpace  (Fin k)), G' ((MeasureTheory.diagScale w) d) =
        (∏ i, |w i|)⁻¹   (y : EuclideanSpace  (Fin k)), G' y
    theorem MeasureTheory.integral_comp_diagScale.{u_1}
      {k : } {G : Type u_1}
      [NormedAddCommGroup G] [NormedSpace  G]
      {w : Fin k  }
      (hw :  (i : Fin k), w i  0)
      (G' : EuclideanSpace  (Fin k)  G) :
       (d : EuclideanSpace  (Fin k)),
          G' ((MeasureTheory.diagScale w) d) =
        (∏ i, |w i|)⁻¹ 
           (y : EuclideanSpace  (Fin k)),
            G' y
    **The coordinatewise change of variables.** Scaling the `k` coordinates by `w` divides the
    integral by `∏ |w i|`. There is no hypothesis on the integrand: the change of variables is along a
    measurable equivalence, so both sides are junk values simultaneously. 
Lemma5.5.4
uses 0
Used by 2
Reverse dependency previews
Preview
Theorem 3.1.2
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
L∃∀N

Fubini for triple iterated integrals. Mathlib's integral_integral_swap exchanges the two integrals of a doubly iterated Bochner integral; nothing there covers the triply iterated case, where the outer variable has to pass both inner ones at once. Both directions are proved here from the two-variable statement, by treating the two inner variables as a single variable of the product and unfolding again on each side. The hypothesis is integrability of the whole integrand against the triple product measure, which is what Fubini needs and what a statement of this kind has to carry.

Lean code for Lemma5.5.42 theorems
  • complete
    theorem MeasureTheory.integral_integral_integral_swap_left.{u_1, u_2, u_3, u_4}
      {α : Type u_1} {β : Type u_2} {γ : Type u_3} [MeasurableSpace α]
      [MeasurableSpace β] [MeasurableSpace γ] {E : Type u_4}
      [NormedAddCommGroup E] [NormedSpace  E] (μ : MeasureTheory.Measure α)
      (ν : MeasureTheory.Measure β) (ρ : MeasureTheory.Measure γ)
      [MeasureTheory.SFinite μ] [MeasureTheory.SFinite ν]
      [MeasureTheory.SFinite ρ] (f : α  β  γ  E)
      (hf :
        MeasureTheory.Integrable (fun p  f p.1 p.2.1 p.2.2)
          (μ.prod (ν.prod ρ))) :
       (a : α),  (b : β),  (c : γ), f a b c ρ ν μ =
         (b : β),  (c : γ),  (a : α), f a b c μ ρ ν
    theorem MeasureTheory.integral_integral_integral_swap_left.{u_1,
        u_2, u_3, u_4}
      {α : Type u_1} {β : Type u_2}
      {γ : Type u_3} [MeasurableSpace α]
      [MeasurableSpace β] [MeasurableSpace γ]
      {E : Type u_4} [NormedAddCommGroup E]
      [NormedSpace  E]
      (μ : MeasureTheory.Measure α)
      (ν : MeasureTheory.Measure β)
      (ρ : MeasureTheory.Measure γ)
      [MeasureTheory.SFinite μ]
      [MeasureTheory.SFinite ν]
      [MeasureTheory.SFinite ρ]
      (f : α  β  γ  E)
      (hf :
        MeasureTheory.Integrable
          (fun p  f p.1 p.2.1 p.2.2)
          (μ.prod (ν.prod ρ))) :
       (a : α),
           (b : β),
             (c : γ), f a b c ρ ν μ =
         (b : β),
           (c : γ),
             (a : α), f a b c μ ρ ν
    **Moving the outermost integral of a triple iterated integral to the innermost position.**
    Mathlib's `MeasureTheory.integral_integral_swap` does this for two variables; here the outer
    variable passes both inner ones at once. 
  • complete
    theorem MeasureTheory.integral_integral_integral_swap_right.{u_1, u_2, u_3, u_4}
      {α : Type u_1} {β : Type u_2} {γ : Type u_3} [MeasurableSpace α]
      [MeasurableSpace β] [MeasurableSpace γ] {E : Type u_4}
      [NormedAddCommGroup E] [NormedSpace  E] (μ : MeasureTheory.Measure α)
      (ν : MeasureTheory.Measure β) (ρ : MeasureTheory.Measure γ)
      [MeasureTheory.SFinite μ] [MeasureTheory.SFinite ν]
      [MeasureTheory.SFinite ρ] (f : α  β  γ  E)
      (hf :
        MeasureTheory.Integrable (fun p  f p.1 p.2.1 p.2.2)
          (μ.prod (ν.prod ρ))) :
       (b : β),  (c : γ),  (a : α), f a b c μ ρ ν =
         (a : α),  (b : β),  (c : γ), f a b c ρ ν μ
    theorem MeasureTheory.integral_integral_integral_swap_right.{u_1,
        u_2, u_3, u_4}
      {α : Type u_1} {β : Type u_2}
      {γ : Type u_3} [MeasurableSpace α]
      [MeasurableSpace β] [MeasurableSpace γ]
      {E : Type u_4} [NormedAddCommGroup E]
      [NormedSpace  E]
      (μ : MeasureTheory.Measure α)
      (ν : MeasureTheory.Measure β)
      (ρ : MeasureTheory.Measure γ)
      [MeasureTheory.SFinite μ]
      [MeasureTheory.SFinite ν]
      [MeasureTheory.SFinite ρ]
      (f : α  β  γ  E)
      (hf :
        MeasureTheory.Integrable
          (fun p  f p.1 p.2.1 p.2.2)
          (μ.prod (ν.prod ρ))) :
       (b : β),
           (c : γ),
             (a : α), f a b c μ ρ ν =
         (a : α),
           (b : β),
             (c : γ), f a b c ρ ν μ
    **Moving the innermost integral of a triple iterated integral to the outermost position**, the
    reverse of `MeasureTheory.integral_integral_integral_swap_left`.