Pith. sign in

IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus.Factorization.FiniteMulCharacter

IndisputableMonolith/Foundation/PrimitiveRecognitionCalculus/Factorization/FiniteMulCharacter.lean · 177 lines · 10 declarations

show as:
view math explainer →

open module explainer GitHub source

Explainer status: ready · generated 2026-08-13 15:19:35.169467+00:00

   1/-
   2  PrimitiveRecognitionCalculus/Factorization/FiniteMulCharacter.lean
   3
   4  A first δ-native finite multiplicative character interface. This is not the
   5  older PRC cost-character/orientation surface; it is a residue-unit character
   6  surface meant for period and Dirichlet-style arithmetic.
   7-/
   8
   9import Mathlib
  10import IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus.Factorization.PeriodSpectrum
  11
  12namespace IndisputableMonolith
  13namespace Foundation
  14namespace PrimitiveRecognitionCalculus
  15namespace Factorization
  16
  17open DistinctionNat
  18
  19/-- A finite multiplicative character on unit residues modulo `N`, represented
  20as a complex-valued function on orbit representatives that respects the native
  21residue relation and multiplies on unit residues. -/
  22structure FiniteMulCharacter (N : DistinctionNat) where
  23  eval : DistinctionNat → ℂ
  24  respects_residue :
  25    ∀ {a b : DistinctionNat} {hN : N ≠ zero},
  26      sameResidue N hN a b → eval a = eval b
  27  map_one : eval one = 1
  28  map_mul_units :
  29    ∀ {a b : DistinctionNat},
  30      unitResidue N a → unitResidue N b →
  31        eval (a * b) = eval a * eval b
  32
  33namespace FiniteMulCharacter
  34
  35/-- The constant-one principal character on unit residues. -/
  36def principal (N : DistinctionNat) : FiniteMulCharacter N where
  37  eval := fun _ => 1
  38  respects_residue := by
  39    intro a b hN h
  40    rfl
  41  map_one := rfl
  42  map_mul_units := by
  43    intro a b ha hb
  44    norm_num
  45
  46@[simp] theorem principal_eval (N a : DistinctionNat) :
  47    (principal N).eval a = 1 := rfl
  48
  49theorem principal_map_mul_units (N a b : DistinctionNat)
  50    (ha : unitResidue N a) (hb : unitResidue N b) :
  51    (principal N).eval (a * b) =
  52      (principal N).eval a * (principal N).eval b := by
  53  exact (principal N).map_mul_units ha hb
  54
  55/-- Product of two finite multiplicative characters. -/
  56def mul {N : DistinctionNat}
  57    (χ ψ : FiniteMulCharacter N) : FiniteMulCharacter N where
  58  eval := fun a => χ.eval a * ψ.eval a
  59  respects_residue := by
  60    intro a b hN h
  61    rw [χ.respects_residue h, ψ.respects_residue h]
  62  map_one := by
  63    rw [χ.map_one, ψ.map_one]
  64    norm_num
  65  map_mul_units := by
  66    intro a b ha hb
  67    rw [χ.map_mul_units ha hb, ψ.map_mul_units ha hb]
  68    ring
  69
  70theorem mul_eval {N : DistinctionNat}
  71    (χ ψ : FiniteMulCharacter N) (a : DistinctionNat) :
  72    (mul χ ψ).eval a = χ.eval a * ψ.eval a := rfl
  73
  74/-- Sum of a character over a finite representative list after left
  75multiplication by a unit. -/
  76theorem scaled_list_eval_sum {N : DistinctionNat}
  77    (χ : FiniteMulCharacter N) (t : DistinctionNat)
  78    (L : List DistinctionNat)
  79    (ht : unitResidue N t)
  80    (hunits : ∀ a ∈ L, unitResidue N a) :
  81    (L.map (fun a => χ.eval (t * a))).sum =
  82      χ.eval t * (L.map χ.eval).sum := by
  83  induction L with
  84  | nil =>
  85      simp
  86  | cons a rest ih =>
  87      have ha : unitResidue N a := hunits a (by simp)
  88      have hrest : ∀ b ∈ rest, unitResidue N b := by
  89        intro b hb
  90        exact hunits b (by simp [hb])
  91      have ih' := ih hrest
  92      simp [χ.map_mul_units ht ha, ih', mul_add]
  93
  94/-- Finite-character orthogonality in the form needed by the δ residue layer.
  95If left multiplication by a unit `t` cycles the chosen representative list and
  96the character is nontrivial on `t`, then the character sum over that list is
  97zero. -/
  98theorem orthogonality_nonprincipal_sum_zero {N : DistinctionNat}
  99    (χ : FiniteMulCharacter N) (t : DistinctionNat)
 100    (L : List DistinctionNat)
 101    (ht : unitResidue N t)
 102    (hunits : ∀ a ∈ L, unitResidue N a)
 103    (hcycle : L.map (fun a => t * a) = L)
 104    (hnontrivial : χ.eval t ≠ 1) :
 105    (L.map χ.eval).sum = 0 := by
 106  let S : ℂ := (L.map χ.eval).sum
 107  have hscaled :
 108      (L.map (fun a => χ.eval (t * a))).sum = S := by
 109    have hcycleEval :=
 110      congrArg (fun M : List DistinctionNat => (M.map χ.eval).sum) hcycle
 111    simpa [List.map_map, S] using hcycleEval
 112  have hmul :
 113      (L.map (fun a => χ.eval (t * a))).sum = χ.eval t * S := by
 114    exact scaled_list_eval_sum χ t L ht hunits
 115  have hmulEq : χ.eval t * S = S := by
 116    rw [← hmul, hscaled]
 117  have hzero : (χ.eval t - 1) * S = 0 := by
 118    rw [sub_mul, one_mul, hmulEq, sub_self]
 119  rcases mul_eq_zero.mp hzero with hleft | hright
 120  · exfalso
 121    exact hnontrivial (sub_eq_zero.mp hleft)
 122  · exact hright
 123
 124end FiniteMulCharacter
 125
 126/-- Certificate for the finite character interface. -/
 127structure FiniteMulCharacterCertificate : Prop where
 128  principal_exists :
 129    ∀ N : DistinctionNat, (FiniteMulCharacter.principal N).eval one = 1
 130  principal_multiplicative :
 131    ∀ N a b : DistinctionNat,
 132      unitResidue N a → unitResidue N b →
 133        (FiniteMulCharacter.principal N).eval (a * b) =
 134          (FiniteMulCharacter.principal N).eval a *
 135            (FiniteMulCharacter.principal N).eval b
 136  character_product_eval :
 137    ∀ {N : DistinctionNat} (χ ψ : FiniteMulCharacter N) (a : DistinctionNat),
 138      (FiniteMulCharacter.mul χ ψ).eval a = χ.eval a * ψ.eval a
 139  scaled_list_eval_sum :
 140    ∀ {N : DistinctionNat} (χ : FiniteMulCharacter N)
 141      (t : DistinctionNat) (L : List DistinctionNat),
 142      unitResidue N t →
 143        (∀ a ∈ L, unitResidue N a) →
 144          (L.map (fun a => χ.eval (t * a))).sum =
 145            χ.eval t * (L.map χ.eval).sum
 146  orthogonality_nonprincipal_sum_zero :
 147    ∀ {N : DistinctionNat} (χ : FiniteMulCharacter N)
 148      (t : DistinctionNat) (L : List DistinctionNat),
 149      unitResidue N t →
 150        (∀ a ∈ L, unitResidue N a) →
 151          L.map (fun a => t * a) = L →
 152            χ.eval t ≠ 1 →
 153              (L.map χ.eval).sum = 0
 154
 155theorem finite_mul_character_certificate : FiniteMulCharacterCertificate where
 156  principal_exists := by
 157    intro N
 158    exact (FiniteMulCharacter.principal N).map_one
 159  principal_multiplicative := by
 160    intro N a b ha hb
 161    exact FiniteMulCharacter.principal_map_mul_units N a b ha hb
 162  character_product_eval := by
 163    intro N χ ψ a
 164    exact FiniteMulCharacter.mul_eval χ ψ a
 165  scaled_list_eval_sum := by
 166    intro N χ t L ht hunits
 167    exact FiniteMulCharacter.scaled_list_eval_sum χ t L ht hunits
 168  orthogonality_nonprincipal_sum_zero := by
 169    intro N χ t L ht hunits hcycle hnontrivial
 170    exact FiniteMulCharacter.orthogonality_nonprincipal_sum_zero
 171      χ t L ht hunits hcycle hnontrivial
 172
 173end Factorization
 174end PrimitiveRecognitionCalculus
 175end Foundation
 176end IndisputableMonolith
 177

source mirrored from github.com/jonwashburn/shape-of-logic