Documentation

Mathlib.Analysis.Fourier.ZMod

Fourier theory on ZMod N #

Basic definitions and properties of the discrete Fourier transform for functions on ZMod N (taking values in an arbitrary -vector space).

Main definitions and results #

noncomputable def ZMod.dft {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] :
(ZMod NE) ≃ₗ[] ZMod NE

The discrete Fourier transform on ℤ / N ℤ (with the counting measure), bundled as a linear equivalence.

Equations
  • ZMod.dft = { toFun := ZMod.auxDFT✝, map_add' := , map_smul' := , invFun := fun (Φ : ZMod NE) (k : ZMod N) => (↑N)⁻¹ ZMod.auxDFT✝ Φ (-k), left_inv := , right_inv := }
Instances For

    The discrete Fourier transform on ℤ / N ℤ (with the counting measure), bundled as a linear equivalence.

    Equations
    Instances For

      The inverse Fourier transform on ZMod N.

      Equations
      Instances For
        theorem ZMod.dft_apply {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] (Φ : ZMod NE) (k : ZMod N) :
        ZMod.dft Φ k = j : ZMod N, ZMod.stdAddChar (-(j * k)) Φ j
        theorem ZMod.dft_def {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] (Φ : ZMod NE) :
        ZMod.dft Φ = fun (k : ZMod N) => j : ZMod N, ZMod.stdAddChar (-(j * k)) Φ j
        theorem ZMod.invDFT_apply {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] (Ψ : ZMod NE) (k : ZMod N) :
        ZMod.dft.symm Ψ k = (↑N)⁻¹ j : ZMod N, ZMod.stdAddChar (j * k) Ψ j
        theorem ZMod.invDFT_def {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] (Ψ : ZMod NE) :
        ZMod.dft.symm Ψ = fun (k : ZMod N) => (↑N)⁻¹ j : ZMod N, ZMod.stdAddChar (j * k) Ψ j
        theorem ZMod.invDFT_apply' {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] (Ψ : ZMod NE) (k : ZMod N) :
        ZMod.dft.symm Ψ k = (↑N)⁻¹ ZMod.dft Ψ (-k)
        theorem ZMod.invDFT_def' {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] (Ψ : ZMod NE) :
        ZMod.dft.symm Ψ = fun (k : ZMod N) => (↑N)⁻¹ ZMod.dft Ψ (-k)
        theorem ZMod.dft_apply_zero {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] (Φ : ZMod NE) :
        ZMod.dft Φ 0 = j : ZMod N, Φ j
        theorem ZMod.dft_eq_fourier {N : } [NeZero N] {E : Type u_2} [NormedAddCommGroup E] [NormedSpace E] [CompleteSpace E] (Φ : ZMod NE) (k : ZMod N) :
        ZMod.dft Φ k = Fourier.fourierIntegral ZMod.toCircle MeasureTheory.Measure.count Φ k

        The discrete Fourier transform agrees with the general one (assuming the target space is a complete normed space).

        Compatibility with scalar multiplication #

        These lemmas are more general than LinearEquiv.map_mul etc, since they allow any scalars that commute with the -action, rather than just itself.

        theorem ZMod.dft_const_smul {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] {R : Type u_2} [DistribSMul R E] [SMulCommClass R E] (r : R) (Φ : ZMod NE) :
        ZMod.dft (r Φ) = r ZMod.dft Φ
        theorem ZMod.dft_smul_const {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] {R : Type u_2} [Ring R] [Module R] [Module R E] [IsScalarTower R E] (Φ : ZMod NR) (e : E) :
        (ZMod.dft fun (j : ZMod N) => Φ j e) = fun (k : ZMod N) => ZMod.dft Φ k e
        theorem ZMod.dft_const_mul {N : } [NeZero N] {R : Type u_2} [Ring R] [Algebra R] (r : R) (Φ : ZMod NR) :
        (ZMod.dft fun (j : ZMod N) => r * Φ j) = fun (k : ZMod N) => r * ZMod.dft Φ k
        theorem ZMod.dft_mul_const {N : } [NeZero N] {R : Type u_2} [Ring R] [Algebra R] (Φ : ZMod NR) (r : R) :
        (ZMod.dft fun (j : ZMod N) => Φ j * r) = fun (k : ZMod N) => ZMod.dft Φ k * r
        theorem ZMod.dft_comp_neg {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] (Φ : ZMod NE) :
        (ZMod.dft fun (j : ZMod N) => Φ (-j)) = fun (k : ZMod N) => ZMod.dft Φ (-k)
        theorem ZMod.dft_dft {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] (Φ : ZMod NE) :
        ZMod.dft (ZMod.dft Φ) = fun (j : ZMod N) => N Φ (-j)

        Fourier inversion formula, discrete case.

        theorem ZMod.dft_comp_unitMul {N : } [NeZero N] {E : Type u_1} [AddCommGroup E] [Module E] (Φ : ZMod NE) (u : (ZMod N)ˣ) (k : ZMod N) :
        ZMod.dft (fun (j : ZMod N) => Φ (u * j)) k = ZMod.dft Φ (u⁻¹ * k)
        theorem ZMod.dft_even_iff {N : } [NeZero N] {Φ : ZMod N} :

        The discrete Fourier transform of Φ is even if and only if Φ itself is.

        theorem ZMod.dft_odd_iff {N : } [NeZero N] {Φ : ZMod N} :
        Function.Odd (ZMod.dft Φ) Function.Odd Φ

        The discrete Fourier transform of Φ is odd if and only if Φ itself is.

        theorem DirichletCharacter.fourierTransform_eq_gaussSum_mulShift {N : } [NeZero N] (χ : DirichletCharacter N) (k : ZMod N) :
        ZMod.dft (⇑χ) k = gaussSum χ (ZMod.stdAddChar.mulShift (-k))
        theorem DirichletCharacter.IsPrimitive.fourierTransform_eq_inv_mul_gaussSum {N : } [NeZero N] {χ : DirichletCharacter N} (hχ : χ.IsPrimitive) (k : ZMod N) :
        ZMod.dft (⇑χ) k = χ⁻¹ (-k) * gaussSum χ ZMod.stdAddChar

        For a primitive Dirichlet character χ, the Fourier transform of χ is a constant multiple of χ⁻¹ (and the constant is essentially the Gauss sum).