Analysis of Boolean Functions in Lean

8.5. Abelian groups🔗

Definition8.5.1
Group: Chapter 8: Generalized domains (128)
Group member previews
Preview
Definition 8.1.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 0
Used by 2
Reverse dependency previews
Preview
Definition 8.5.2
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
L∃∀N

Definition 8.51. Let G be a finite abelian group. The complex function space L^2(G^n) uses the uniform law and Hermitian inner product \langle f,g\rangle =\mathbb E_{x\sim G^n}[f(x)\overline{g(x)}].

Lean code for Definition8.5.17 declarations
  • abbrevdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    abbrev FABL.AbelianL2.{u_1} (G : Type u_1) (n : ) : Type u_1
    abbrev FABL.AbelianL2.{u_1} (G : Type u_1)
      (n : ) : Type u_1
    O'Donnell, Definition 8.51: the complex function space on the `n`-fold power of a finite
    abelian group.  Allowing `n = 0` is a harmless generalization. 
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.complexUniformInner.{u_1} {Ω : Type u_1} [Fintype Ω]
      (f g : Ω  ) : 
    def FABL.complexUniformInner.{u_1}
      {Ω : Type u_1} [Fintype Ω]
      (f g : Ω  ) : 
    The normalized complex inner product `⟨f,g⟩ = ᵓ[conj f · g]` on a finite type. 
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.complexMean.{u_1} {Ω : Type u_1} [Fintype Ω] (f : Ω  ) : 
    def FABL.complexMean.{u_1} {Ω : Type u_1}
      [Fintype Ω] (f : Ω  ) : 
    The uniform complex expectation. 
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.complexCovariance.{u_1} {Ω : Type u_1} [Fintype Ω] (f g : Ω  ) :
      
    def FABL.complexCovariance.{u_1}
      {Ω : Type u_1} [Fintype Ω]
      (f g : Ω  ) : 
    Complex covariance with conjugation in the first argument. 
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.complexVariance.{u_1} {Ω : Type u_1} [Fintype Ω] (f : Ω  ) : 
    def FABL.complexVariance.{u_1} {Ω : Type u_1}
      [Fintype Ω] (f : Ω  ) : 
    Complex variance, represented in the scalar field as `⟨f-ᵓf,f-ᵓf⟩`. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.complexUniformInner_eq_expect.{u_1} {Ω : Type u_1} [Fintype Ω]
      (f g : Ω  ) :
      FABL.complexUniformInner f g =
        Finset.univ.expect fun x => (starRingEnd ) (f x) * g x
    theorem FABL.complexUniformInner_eq_expect.{u_1}
      {Ω : Type u_1} [Fintype Ω]
      (f g : Ω  ) :
      FABL.complexUniformInner f g =
        Finset.univ.expect fun x =>
          (starRingEnd ) (f x) * g x
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.complexUniformInner_self_eq_expect_absSq.{u_1} {Ω : Type u_1}
      [Fintype Ω] (f : Ω  ) :
      FABL.complexUniformInner f f =
        Finset.univ.expect fun x => (starRingEnd ) (f x) * f x
    theorem FABL.complexUniformInner_self_eq_expect_absSq.{u_1}
      {Ω : Type u_1} [Fintype Ω] (f : Ω  ) :
      FABL.complexUniformInner f f =
        Finset.univ.expect fun x =>
          (starRingEnd ) (f x) * f x
    Exercise 8.32: `⟨f,f⟩` is the uniform second moment `𝔼[|f|²]`. 
Definition8.5.2
Group: Chapter 8: Generalized domains (128)
Group member previews
Preview
Definition 8.1.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 1
Used by 4
Reverse dependency previews
Preview
Lemma 8.5.3
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
L∃∀N

Definition 8.52. A character is a homomorphism \chi:G\to\mathbb C^\times, so \chi(x+y)=\chi(x)\chi(y). Since G is finite, every value is a root of unity and |\chi(x)|=1.

Lean code for Definition8.5.22 definitions
  • abbrevdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    abbrev FABL.AbelianCharacter.{u_1} (G : Type u_1) [AddCommGroup G] : Type u_1
    abbrev FABL.AbelianCharacter.{u_1} (G : Type u_1)
      [AddCommGroup G] : Type u_1
    O'Donnell, Definition 8.52: a complex character of a finite abelian group. 
  • abbrevdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    abbrev FABL.AbelianDual.{u_1} (G : Type u_1) [AddCommGroup G] : Type u_1
    abbrev FABL.AbelianDual.{u_1} (G : Type u_1)
      [AddCommGroup G] : Type u_1
    The dual group of a finite abelian group. 
Lemma8.5.3
Group: Chapter 8: Generalized domains (128)
Group member previews
Preview
Definition 8.1.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 1used by 1L∃∀N

Fact 8.53. If \chi and \phi are characters, then \overline\chi and the pointwise product \phi\chi are characters.

Lean code for Lemma8.5.32 definitions
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.characterConj.{u_1} {G : Type u_1} [AddCommGroup G]
      (χ : FABL.AbelianCharacter G) : FABL.AbelianCharacter G
    def FABL.characterConj.{u_1} {G : Type u_1}
      [AddCommGroup G]
      (χ : FABL.AbelianCharacter G) :
      FABL.AbelianCharacter G
    O'Donnell, Fact 8.53: complex conjugation of a character is its inverse character. 
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.characterMulConj.{u_1} {G : Type u_1} [AddCommGroup G]
      (φ χ : FABL.AbelianCharacter G) : FABL.AbelianCharacter G
    def FABL.characterMulConj.{u_1} {G : Type u_1}
      [AddCommGroup G]
      (φ χ : FABL.AbelianCharacter G) :
      FABL.AbelianCharacter G
    O'Donnell, Fact 8.53: the pointwise product of a character with a conjugate character is a
    character. 
Theorem8.5.4
Group: Chapter 8: Generalized domains (128)
Group member previews
Preview
Definition 8.1.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 1used by 1L∃∀N

Proposition 8.54. Every character \chi is either identically 1 or satisfies \mathbb E_{x\sim G}[\chi(x)]=0.

Lean code for Theorem8.5.42 theorems
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.character_eq_zero_or_expect_eq_zero.{u_1} {G : Type u_1}
      [AddCommGroup G] [Fintype G] (χ : FABL.AbelianCharacter G) :
      χ = 0  (Finset.univ.expect fun x => χ x) = 0
    theorem FABL.character_eq_zero_or_expect_eq_zero.{u_1}
      {G : Type u_1} [AddCommGroup G]
      [Fintype G]
      (χ : FABL.AbelianCharacter G) :
      χ = 0 
        (Finset.univ.expect fun x => χ x) = 0
    O'Donnell, Proposition 8.54: a character is trivial or has uniform expectation zero. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.expect_character_eq_ite.{u_1} {G : Type u_1} [AddCommGroup G]
      [Fintype G] (χ : FABL.AbelianCharacter G) :
      (Finset.univ.expect fun x => χ x) = if χ = 0 then 1 else 0
    theorem FABL.expect_character_eq_ite.{u_1}
      {G : Type u_1} [AddCommGroup G]
      [Fintype G]
      (χ : FABL.AbelianCharacter G) :
      (Finset.univ.expect fun x => χ x) =
        if χ = 0 then 1 else 0
    The exact expectation formula strengthening Proposition 8.54. 
Theorem8.5.5
Group: Chapter 8: Generalized domains (128)
Group member previews
Preview
Definition 8.1.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
Statement uses 2
Statement dependency previews
Preview
Lemma 8.5.3
Loading preview
Statement dependency preview content is loaded from the rendered-fragment cache.
Used by 2
Reverse dependency previews
Preview
Definition 8.5.6
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
L∃∀N

Proposition 8.55. All characters of G are orthonormal. Consequently there are at most |G|=\dim L^2(G) characters.

Lean code for Theorem8.5.54 declarations
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.characters_orthonormal.{u_1} {G : Type u_1} [AddCommGroup G]
      [Fintype G] (φ χ : FABL.AbelianCharacter G) :
      FABL.complexUniformInner φ χ = if φ = χ then 1 else 0
    theorem FABL.characters_orthonormal.{u_1}
      {G : Type u_1} [AddCommGroup G]
      [Fintype G]
      (φ χ : FABL.AbelianCharacter G) :
      FABL.complexUniformInner φ χ =
        if φ = χ then 1 else 0
    O'Donnell, Proposition 8.55: all complex characters are orthonormal. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.card_abelianCharacter_le.{u_1} {G : Type u_1} [AddCommGroup G]
      [Fintype G] : Fintype.card (FABL.AbelianCharacter G)  Fintype.card G
    theorem FABL.card_abelianCharacter_le.{u_1}
      {G : Type u_1} [AddCommGroup G]
      [Fintype G] :
      Fintype.card (FABL.AbelianCharacter G) 
        Fintype.card G
    The consequence in Proposition 8.55: there are at most `|G|` characters. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.card_abelianCharacter.{u_1} {G : Type u_1} [AddCommGroup G]
      [Fintype G] : Fintype.card (FABL.AbelianCharacter G) = Fintype.card G
    theorem FABL.card_abelianCharacter.{u_1}
      {G : Type u_1} [AddCommGroup G]
      [Fintype G] :
      Fintype.card (FABL.AbelianCharacter G) =
        Fintype.card G
    Exercise 8.35(a), in Mathlib's stronger classification-free form: a finite abelian group has
    exactly `|G|` complex characters. 
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.abelianFourierBasis.{u_1} (G : Type u_1) [AddCommGroup G]
      [Finite G] : Module.Basis (FABL.AbelianCharacter G)  (G  )
    def FABL.abelianFourierBasis.{u_1}
      (G : Type u_1) [AddCommGroup G]
      [Finite G] :
      Module.Basis (FABL.AbelianCharacter G) 
        (G  )
    The canonical character-indexed Fourier basis of `L²(G)`. 
Definition8.5.6
Group: Chapter 8: Generalized domains (128)
Group member previews
Preview
Definition 8.1.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 1
Used by 2
Reverse dependency previews
Preview
Definition 8.5.7
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
L∃∀N

Definition 8.56. Fix m\ge2 and \omega=\exp(2\pi i/m). For 0\le j<m, define a character of \mathbb Z_m by \chi_j(x)=\omega^{jx}. These m characters are distinct and form a Fourier basis of L^2(\mathbb Z_m).

Lean code for Definition8.5.64 declarations
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.zmodCharacter (m : ) [NeZero m] (j : ZMod m) :
      FABL.AbelianCharacter (ZMod m)
    def FABL.zmodCharacter (m : ) [NeZero m]
      (j : ZMod m) :
      FABL.AbelianCharacter (ZMod m)
    O'Donnell, Definition 8.56: the standard character of `ZMod m` indexed by `j`.
    Mathlib's `zmodAddEquiv` packages the root-of-unity construction and its injectivity. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.zmodCharacter_injective (m : ) [NeZero m] :
      Function.Injective (FABL.zmodCharacter m)
    theorem FABL.zmodCharacter_injective (m : )
      [NeZero m] :
      Function.Injective
        (FABL.zmodCharacter m)
    Definition 8.56: distinct cyclic indices give distinct characters. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.zmodCharacter_intCast (m : ) [NeZero m] (j x : ) :
      (FABL.zmodCharacter m j) x =
        Complex.exp (2 * Real.pi * (j * x / m) * Complex.I)
    theorem FABL.zmodCharacter_intCast (m : )
      [NeZero m] (j x : ) :
      (FABL.zmodCharacter m j) x =
        Complex.exp
          (2 * Real.pi * (j * x / m) *
            Complex.I)
    Definition 8.56 in exponential form on integer representatives. 
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.zmodFourierBasis (m : ) [NeZero m] :
      Module.Basis (ZMod m)  (ZMod m  )
    def FABL.zmodFourierBasis (m : ) [NeZero m] :
      Module.Basis (ZMod m)  (ZMod m  )
    The cyclic characters, indexed by `ZMod m`, form the Fourier basis of `L²(ZMod m)`. 
Definition8.5.7
Group: Chapter 8: Generalized domains (128)
Group member previews
Preview
Definition 8.1.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
Statement uses 2
Statement dependency previews
Preview
Theorem 8.1.13
Loading preview
Statement dependency preview content is loaded from the rendered-fragment cache.
used by 1L∃∀N

Definition 8.57. For \alpha\in\mathbb N^n_{<m}, define \chi_\alpha(x)=\prod_{j=1}^n\chi_{\alpha_j}(x_j). These are all the characters of \mathbb Z_m^n and form its complex Fourier basis.

Lean code for Definition8.5.76 declarations
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.zmodProductCharacter (m n : ) [NeZero m] (α : Fin n  ZMod m) :
      FABL.AbelianCharacter (Fin n  ZMod m)
    def FABL.zmodProductCharacter (m n : )
      [NeZero m] (α : Fin n  ZMod m) :
      FABL.AbelianCharacter (Fin n  ZMod m)
    O'Donnell, Definition 8.57: the product character of `(ZMod m)ⁿ` indexed by `α`. 
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.zmodProductCharacterHom (m n : ) [NeZero m] :
      (Fin n  ZMod m) →+ FABL.AbelianCharacter (Fin n  ZMod m)
    def FABL.zmodProductCharacterHom (m n : )
      [NeZero m] :
      (Fin n  ZMod m) →+
        FABL.AbelianCharacter (Fin n  ZMod m)
    The product-character indexing is an additive homomorphism; addition in the character group
    is pointwise multiplication. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.zmodProductCharacter_apply_single (m n : ) [NeZero m]
      (α : Fin n  ZMod m) (i : Fin n) (y : ZMod m) :
      (FABL.zmodProductCharacter m n α) (Pi.single i y) =
        (FABL.zmodCharacter m (α i)) y
    theorem FABL.zmodProductCharacter_apply_single
      (m n : ) [NeZero m]
      (α : Fin n  ZMod m) (i : Fin n)
      (y : ZMod m) :
      (FABL.zmodProductCharacter m n α)
          (Pi.single i y) =
        (FABL.zmodCharacter m (α i)) y
    Evaluation on a one-coordinate vector recovers the corresponding cyclic character. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.zmodProductCharacter_injective (m n : ) [NeZero m] :
      Function.Injective (FABL.zmodProductCharacter m n)
    theorem FABL.zmodProductCharacter_injective
      (m n : ) [NeZero m] :
      Function.Injective
        (FABL.zmodProductCharacter m n)
    Definition 8.57: distinct multi-indices give distinct product characters. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.zmodProductCharacter_bijective (m n : ) [NeZero m] :
      Function.Bijective (FABL.zmodProductCharacter m n)
    theorem FABL.zmodProductCharacter_bijective
      (m n : ) [NeZero m] :
      Function.Bijective
        (FABL.zmodProductCharacter m n)
    Every character of `(ZMod m)ⁿ` is a unique product character. 
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.zmodProductFourierBasis (m n : ) [NeZero m] :
      Module.Basis (Fin n  ZMod m)  ((Fin n  ZMod m)  )
    def FABL.zmodProductFourierBasis (m n : )
      [NeZero m] :
      Module.Basis (Fin n  ZMod m) 
        ((Fin n  ZMod m)  )
    Definition 8.57: the product characters form the Fourier basis of `L²((ZMod m)ⁿ)`. 
Lemma8.5.8
Group: Chapter 8: Generalized domains (128)
Group member previews
Preview
Definition 8.1.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 1used by 0L∃∀N

Fact 8.58. The characters form the dual group under pointwise multiplication: \chi_\alpha\chi_\beta=\chi_{\alpha+\beta}, \qquad \chi_\alpha^{-1}=\overline{\chi_\alpha}=\chi_{-\alpha}.

Lean code for Lemma8.5.83 declarations
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.zmodProductCharacter_add (m n : ) [NeZero m]
      (α β : Fin n  ZMod m) :
      FABL.zmodProductCharacter m n (α + β) =
        FABL.zmodProductCharacter m n α * FABL.zmodProductCharacter m n β
    theorem FABL.zmodProductCharacter_add (m n : )
      [NeZero m] (α β : Fin n  ZMod m) :
      FABL.zmodProductCharacter m n (α + β) =
        FABL.zmodProductCharacter m n α *
          FABL.zmodProductCharacter m n β
    O'Donnell, Fact 8.58: multiplication of product characters adds their indices. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.zmodProductCharacter_neg (m n : ) [NeZero m]
      (α : Fin n  ZMod m) :
      FABL.zmodProductCharacter m n (-α) =
        (FABL.zmodProductCharacter m n α)⁻¹
    theorem FABL.zmodProductCharacter_neg (m n : )
      [NeZero m] (α : Fin n  ZMod m) :
      FABL.zmodProductCharacter m n (-α) =
        (FABL.zmodProductCharacter m n α)⁻¹
    O'Donnell, Fact 8.58: conjugation/inversion negates a product-character index. 
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.zmodProductCharacterAddEquiv (m n : ) [NeZero m] :
      (Fin n  ZMod m) ≃+ FABL.AbelianDual (Fin n  ZMod m)
    def FABL.zmodProductCharacterAddEquiv
      (m n : ) [NeZero m] :
      (Fin n  ZMod m) ≃+
        FABL.AbelianDual (Fin n  ZMod m)
    Exercise 8.35 and Fact 8.58 for `(ZMod m)ⁿ`: product characters identify the group with its
    dual group. 
Definition8.5.9
Group: Chapter 8: Generalized domains (128)
Group member previews
Preview
Definition 8.1.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
uses 1
Used by 2
Reverse dependency previews
Preview
Theorem 8.5.10
Loading preview
Reverse dependency preview content is loaded from the rendered-fragment cache.
L∃∀N

Definition 8.59. For f,g\in L^2(G), normalized convolution is (f*g)(x) =\mathbb E_{y\sim G}[f(y)g(x-y)] =\mathbb E_{y\sim G}[f(x-y)g(y)].

Lean code for Definition8.5.93 declarations
  • defdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    def FABL.abelianConvolution.{u_1} {G : Type u_1} [AddCommGroup G]
      [Fintype G] (f g : G  ) : G  
    def FABL.abelianConvolution.{u_1}
      {G : Type u_1} [AddCommGroup G]
      [Fintype G] (f g : G  ) : G  
    O'Donnell, Definition 8.59: normalized convolution on a finite abelian group.
    The unnormalized sum is Mathlib's `DiscreteConvolution.addConvolution`. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.abelianConvolution_apply.{u_1} {G : Type u_1} [AddCommGroup G]
      [Fintype G] (f g : G  ) (x : G) :
      FABL.abelianConvolution f g x =
        Finset.univ.expect fun y => f y * g (x - y)
    theorem FABL.abelianConvolution_apply.{u_1}
      {G : Type u_1} [AddCommGroup G]
      [Fintype G] (f g : G  ) (x : G) :
      FABL.abelianConvolution f g x =
        Finset.univ.expect fun y =>
          f y * g (x - y)
    The expectation formula in Definition 8.59. 
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.abelianConvolution_apply_swap.{u_1} {G : Type u_1} [AddCommGroup G]
      [Fintype G] (f g : G  ) (x : G) :
      FABL.abelianConvolution f g x =
        Finset.univ.expect fun y => f (x - y) * g y
    theorem FABL.abelianConvolution_apply_swap.{u_1}
      {G : Type u_1} [AddCommGroup G]
      [Fintype G] (f g : G  ) (x : G) :
      FABL.abelianConvolution f g x =
        Finset.univ.expect fun y =>
          f (x - y) * g y
    The second expectation formula in Definition 8.59. 
Theorem8.5.10
Group: Chapter 8: Generalized domains (128)
Group member previews
Preview
Definition 8.1.1
Loading preview
Group member preview content is loaded from the rendered-fragment cache.
Statement uses 2
Statement dependency previews
Preview
Definition 8.5.2
Loading preview
Statement dependency preview content is loaded from the rendered-fragment cache.
used by 1L∃∀N

Theorem 8.60. Fourier transformation diagonalizes normalized convolution: \widehat{f*g}(\alpha) =\widehat f(\alpha)\widehat g(\alpha).

Lean code for Theorem8.5.101 theorem
  • theoremdefined in FABL/Chapter08/AbelianGroups.lean
    complete
    theorem FABL.abelianFourierCoeff_convolution.{u_1} {G : Type u_1}
      [AddCommGroup G] [Fintype G] (f g : G  )
      (χ : FABL.AbelianCharacter G) :
      FABL.abelianFourierCoeff (FABL.abelianConvolution f g) χ =
        FABL.abelianFourierCoeff f χ * FABL.abelianFourierCoeff g χ
    theorem FABL.abelianFourierCoeff_convolution.{u_1}
      {G : Type u_1} [AddCommGroup G]
      [Fintype G] (f g : G  )
      (χ : FABL.AbelianCharacter G) :
      FABL.abelianFourierCoeff
          (FABL.abelianConvolution f g) χ =
        FABL.abelianFourierCoeff f χ *
          FABL.abelianFourierCoeff g χ
    O'Donnell, Theorem 8.60 and Exercise 8.36: normalized convolution becomes pointwise
    multiplication under the finite-abelian Fourier transform.