Documentation

LeanAPAP.Prereqs.AddChar.PontryaginDuality

Pontryagin duality for finite abelian groups #

This file proves the Pontryagin duality in case of finite abelian groups. This states that any finite abelian group is canonically isomorphic to its double dual (the space of complex-valued characters of its space of complex-valued characters).

We first prove it for ZMod n and then extend to all finite abelian groups using the Structure Theorem.

@[simp]
theorem AddChar.zmodAuxAux_apply (n : ) (z : ) :
(AddChar.zmodAuxAux n) z = Additive.ofMul (Circle.e (z / n))
@[simp]
theorem AddChar.aux (n : ) (h : (AddChar.zmodAuxAux n) n = 0) :
{ val := AddChar.zmodAuxAux n, property := h } = AddChar.zmodAuxAux n
@[simp]
theorem AddChar.zmodAux_apply (n : ) (z : ) :
(AddChar.zmodAux n) z = Circle.e (z / n)
def AddChar.zmod (n : ) (x : ZMod n) :

Indexing of the complex characters of ZMod n. AddChar.zmod n x is the character sending y to e ^ (2 * π * i * x * y / n).

Equations
Instances For
    @[simp]
    theorem AddChar.zmod_apply (n : ) (x : ) (y : ) :
    (AddChar.zmod n x) y = Circle.e (x * y / n)
    @[simp]
    theorem AddChar.zmod_zero (n : ) :
    @[simp]
    theorem AddChar.zmod_add (n : ) (x : ZMod n) (y : ZMod n) :
    @[simp]
    theorem AddChar.zmod_inj {n : } (hn : n 0) {x : ZMod n} {y : ZMod n} :
    Equations
    Instances For
      def AddChar.mkZModAux {ι : Type} [DecidableEq ι] (n : ι) (u : (i : ι) → ZMod (n i)) :
      AddChar (DirectSum ι fun (i : ι) => ZMod (n i)) circle
      Equations
      Instances For
        theorem AddChar.mkZModAux_injective {ι : Type} [DecidableEq ι] {n : ι} (hn : ∀ (i : ι), n i 0) :

        The circle-valued characters of a finite abelian group are the same as its complex-valued characters.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          @[simp]
          def AddChar.zmodAddEquiv {n : } (hn : n 0) :

          ZMod n is (noncanonically) isomorphic to its group of characters.

          Equations
          Instances For
            @[simp]
            theorem AddChar.zmodAddEquiv_apply {n : } [NeZero n] (x : ZMod n) :
            (AddChar.zmodAddEquiv ) x = AddChar.circleEquivComplex (AddChar.zmod n x)
            def AddChar.complexBasis (α : Type u_1) [AddCommGroup α] [Finite α] :
            Basis (AddChar α ) (α)

            Complex-valued characters of a finite abelian group α form a basis of α → ℂ.

            Equations
            Instances For
              @[simp]
              theorem AddChar.coe_complexBasis (α : Type u_1) [AddCommGroup α] [Finite α] :
              (AddChar.complexBasis α) = DFunLike.coe
              @[simp]
              theorem AddChar.complexBasis_apply {α : Type u_1} [AddCommGroup α] [Finite α] (ψ : AddChar α ) :
              (AddChar.complexBasis α) ψ = ψ
              theorem AddChar.exists_apply_ne_zero {α : Type u_1} [AddCommGroup α] {a : α} [Finite α] :
              (∃ (ψ : AddChar α ), ψ a 1) a 0
              theorem AddChar.forall_apply_eq_zero {α : Type u_1} [AddCommGroup α] {a : α} [Finite α] :
              (∀ (ψ : AddChar α ), ψ a = 1) a = 0
              theorem AddChar.doubleDualEmb_injective {α : Type u_1} [AddCommGroup α] [Finite α] :
              Function.Injective AddChar.doubleDualEmb
              theorem AddChar.doubleDualEmb_bijective {α : Type u_1} [AddCommGroup α] [Finite α] :
              Function.Bijective AddChar.doubleDualEmb
              @[simp]
              theorem AddChar.doubleDualEmb_inj {α : Type u_1} [AddCommGroup α] {a : α} {b : α} [Finite α] :
              AddChar.doubleDualEmb a = AddChar.doubleDualEmb b a = b
              @[simp]
              theorem AddChar.doubleDualEmb_eq_zero {α : Type u_1} [AddCommGroup α] {a : α} [Finite α] :
              AddChar.doubleDualEmb a = 0 a = 0
              theorem AddChar.doubleDualEmb_ne_zero {α : Type u_1} [AddCommGroup α] {a : α} [Finite α] :
              AddChar.doubleDualEmb a 0 a 0

              The double dual isomorphism.

              Equations
              Instances For
                @[simp]
                theorem AddChar.coe_doubleDualEquiv {α : Type u_1} [AddCommGroup α] [Finite α] :
                AddChar.doubleDualEquiv = AddChar.doubleDualEmb
                @[simp]
                theorem AddChar.doubleDualEmb_doubleDualEquiv_symm_apply {α : Type u_1} [AddCommGroup α] [Finite α] (a : AddChar (AddChar α ) ) :
                AddChar.doubleDualEmb ((AddEquiv.symm AddChar.doubleDualEquiv) a) = a
                @[simp]
                theorem AddChar.doubleDualEquiv_symm_doubleDualEmb_apply {α : Type u_1} [AddCommGroup α] [Finite α] (a : AddChar (AddChar α ) ) :
                (AddEquiv.symm AddChar.doubleDualEquiv) (AddChar.doubleDualEmb a) = a
                theorem AddChar.sum_apply_eq_ite {α : Type u_1} [AddCommGroup α] [Fintype α] [DecidableEq α] (a : α) :
                (Finset.sum Finset.univ fun (ψ : AddChar α ) => ψ a) = if a = 0 then (Fintype.card α) else 0
                theorem AddChar.expect_apply_eq_ite {α : Type u_1} [AddCommGroup α] [Fintype α] [DecidableEq α] (a : α) :
                (Finset.expect Finset.univ fun (ψ : AddChar α ) => ψ a) = if a = 0 then 1 else 0
                theorem AddChar.sum_apply_eq_zero_iff_ne_zero {α : Type u_1} [AddCommGroup α] {a : α} [Finite α] :
                (Finset.sum Finset.univ fun (ψ : AddChar α ) => ψ a) = 0 a 0
                theorem AddChar.sum_apply_ne_zero_iff_eq_zero {α : Type u_1} [AddCommGroup α] {a : α} [Finite α] :
                (Finset.sum Finset.univ fun (ψ : AddChar α ) => ψ a) 0 a = 0
                theorem AddChar.expect_apply_eq_zero_iff_ne_zero {α : Type u_1} [AddCommGroup α] {a : α} [Finite α] :
                (Finset.expect Finset.univ fun (ψ : AddChar α ) => ψ a) = 0 a 0
                theorem AddChar.expect_apply_ne_zero_iff_eq_zero {α : Type u_1} [AddCommGroup α] {a : α} [Finite α] :
                (Finset.expect Finset.univ fun (ψ : AddChar α ) => ψ a) 0 a = 0