Paper IX · Lean source

PolynomialLiftCounts.lean

Selected results recorded Coverage and evidence

Compiler/replay evidence is reported for a subset or bounded block. No whole-work coverage is implied.

This viewer reads the retained source; it does not run Lean or assign new claim mappings.

polynomial_parameter_towers/formalization/PolynomialLiftCounts.lean117 lines

Original source pathpreserved/PRSC_IX_Consolidated_Manuscript/polynomial_parameter_towers/formalization/PolynomialLiftCounts.lean
Skip declarations and read code

Skip source text

1 module
2 public import PolynomialDigitBridge
3 public import ResidueLiftDigits
4 public import FiniteFiberCounts
5 public import IntegerFiniteCokernel
6 
7 @[expose] public section
8 noncomputable section
9 set_option autoImplicit false
10 open scoped Classical
11 
12 namespace Komorebi.PolynomialLiftCounts
13 open Komorebi.NativeAffine Komorebi.PolynomialObstruction
14 open Komorebi.PolynomialDigitBridge Komorebi.ResidueLiftDigits
15 variable {d e : ℕ}
16 
17 /-- Actual next-level residue classes solving the original polynomial equations
18 and retaining the prescribed lower residue. Evaluation uses their canonical
19 integer representatives; polynomial congruence makes this representative independent. -/
20 abbrev ActualLifts (q L : ℕ) (F : Fin e → MvPolynomial (Fin d) ℤ)
21     (x : Fin d → ℤ) :=
22   {y : ResidueFiber q L x // ∀ i, (q : ℤ)^(L+1) ∣
23     evalSystem F (integerLift (q^(L+1)) y.val) i}
24 
25 /-- The residue class represented by a correction solves the actual equations
26 exactly when the finite Jacobian cancels the residual digit. -/
27 theorem digit_residue_solution_iff (q L : ℕ) (hq : 0 < q) (hL : 1 ≤ L)
28     (F : Fin e → MvPolynomial (Fin d) ℤ) (x : Fin d → ℤ)
29     (r : Fin e → ℤ) (hr : evalSystem F x = (q : ℤ)^L • r)
30     (t : Fin d → ZMod q) :
31     (∀ i, (q : ℤ)^(L+1) ∣ evalSystem F
32       (integerLift (q^(L+1)) (digitEquivResidue q L hq x t).val) i) ↔
33       reduction q e r + digitJacobian q F x t = 0 := by
34   rw [← digit_solution_iff q L hq hL F x r hr t]
35   apply forall_congr'
36   intro i
37   apply dvd_iff_of_dvd_sub
38   apply Komorebi.PolynomialTaylor.eval_dvd_of_dvd
39   intro k
40   exact next_modulus_dvd_val_sub_shift q L hq x t k
41 
42 /-- The correction-digit fiber is precisely the finite set of actual polynomial lifts. -/
43 def digitEquivLifts (q L : ℕ) (hq : 0 < q) (hL : 1 ≤ L)
44     (F : Fin e → MvPolynomial (Fin d) ℤ) (x : Fin d → ℤ)
45     (r : Fin e → ℤ) (hr : evalSystem F x = (q : ℤ)^L • r) :
46     DigitSolutions q F x r ≃ ActualLifts q L F x :=
47   Equiv.subtypeEquiv (digitEquivResidue q L hq x)
48     (fun t => (digit_residue_solution_iff q L hq hL F x r hr t).symm)
49 
50 /-- The actual nonempty digit fiber carries its natural kernel torsor structure. -/
51 @[instance_reducible] def digitAddTorsor (q : ℕ) (hq : 0 < q)
52     (F : Fin e → MvPolynomial (Fin d) ℤ) (x : Fin d → ℤ) (r : Fin e → ℤ)
53     (h : obstruction q (jacobian F x) r = 0) :
54     AddTorsor (digitJacobian q F x).ker (DigitSolutions q F x r) :=
55   FiniteFiberCounts.fiberAddTorsor (digitJacobian q F x) (reduction q e r)
56     ((digit_solutions_nonempty_iff q hq F x r).mpr h)
57 
58 /-- A chosen valid digit identifies all distinct next-level lifts with the kernel. -/
59 def liftEquivKernel (q L : ℕ) (hq : 0 < q) (hL : 1 ≤ L)
60     (F : Fin e → MvPolynomial (Fin d) ℤ) (x : Fin d → ℤ)
61     (r : Fin e → ℤ) (hr : evalSystem F x = (q : ℤ)^L • r)
62     (u : DigitSolutions q F x r) :
63     ActualLifts q L F x ≃ (digitJacobian q F x).ker :=
64   (digitEquivLifts q L hq hL F x r hr).symm.trans
65     (FiniteFiberCounts.fiberEquivKernel (digitJacobian q F x) (reduction q e r) u)
66 
67 /-- The previously constructed obstruction is the actual residue-ring cokernel. -/
68 def obstructionEquiv (q : ℕ) (F : Fin e → MvPolynomial (Fin d) ℤ) (x : Fin d → ℤ) :
69     Obstruction q (jacobian F x) ≃ₗ[ℤ]
70       ((Fin e → ZMod q) ⧸ (digitJacobian q F x).range) :=
71   IntegerFiniteCokernel.cokernelEquiv q (jacobian F x) (digitJacobian q F x)
72     (reduction_jacobian q F x)
73 
74 @[simp] theorem obstructionEquiv_class (q : ℕ)
75     (F : Fin e → MvPolynomial (Fin d) ℤ) (x : Fin d → ℤ) (r : Fin e → ℤ) :
76     obstructionEquiv q F x (obstruction q (jacobian F x) r) =
77       Submodule.Quotient.mk (reduction q e r) := rfl
78 
79 /-- Exact count of distinct polynomial lift classes; an obstruction gives zero. -/
80 theorem lift_card (p L : ℕ) [Fact (Nat.Prime p)] (hL : 1 ≤ L)
81     (F : Fin e → MvPolynomial (Fin d) ℤ) (x : Fin d → ℤ)
82     (r : Fin e → ℤ) (hr : evalSystem F x = (p : ℤ)^L • r) :
83     Nat.card (ActualLifts p L F x) =
84       if obstruction p (jacobian F x) r = 0 then
85         p ^ (d - FiniteFiberCounts.rank p (digitJacobian p F x)) else 0 := by
86   have hp : 0 < p := (Fact.out : Nat.Prime p).pos
87   have hc := FiniteFiberCounts.fiber_card p (digitJacobian p F x) (reduction p e r)
88   change Nat.card (DigitSolutions p F x r) =
89     if Nonempty (DigitSolutions p F x r) then
90       p ^ (d - FiniteFiberCounts.rank p (digitJacobian p F x)) else 0 at hc
91   rw [digit_solutions_nonempty_iff p hp F x r] at hc
92   rw [← Nat.card_congr (digitEquivLifts p L hp hL F x r hr)]
93   exact hc
94 
95 /-- Exact cardinality of the original obstruction group, not just a surrogate. -/
96 theorem obstruction_card (p : ℕ) [Fact (Nat.Prime p)]
97     (F : Fin e → MvPolynomial (Fin d) ℤ) (x : Fin d → ℤ) :
98     Nat.card (Obstruction p (jacobian F x)) =
99       p ^ (e - FiniteFiberCounts.rank p (digitJacobian p F x)) := by
100   rw [Nat.card_congr (obstructionEquiv p F x).toEquiv]
101   exact FiniteFiberCounts.cokernel_card p (digitJacobian p F x)
102 
103 /-- Counts and residual are obtained from the actual lower polynomial solution. -/
104 theorem finite_polynomial_lift_count (p L : ℕ) [Fact (Nat.Prime p)] (hL : 1 ≤ L)
105     (F : Fin e → MvPolynomial (Fin d) ℤ) (x : Fin d → ℤ)
106     (hx : ∀ i, (p : ℤ)^L ∣ evalSystem F x i) :
107     ∃ r : Fin e → ℤ,
108       evalSystem F x = (p : ℤ)^L • r ∧
109       Nat.card (ActualLifts p L F x) =
110         (if obstruction p (jacobian F x) r = 0 then
111           p ^ (d - FiniteFiberCounts.rank p (digitJacobian p F x)) else 0) ∧
112       Nat.card (Obstruction p (jacobian F x)) =
113         p ^ (e - FiniteFiberCounts.rank p (digitJacobian p F x)) := by
114   obtain ⟨r, hr⟩ := Komorebi.PolynomialObstruction.residual_exists p L F x hx
115   exact ⟨r, hr, lift_card p L hL F x r hr, obstruction_card p F x⟩
116 
117 end Komorebi.PolynomialLiftCounts

Back to source controls

Original file and source record

This copy matches the recorded source file. Its publication here does not change the work’s review status.

SHA-256: 10c01bfa8a892f0b6aacb7f36e1c0c86cef6ddfa51917ae5c0a84be32f963931

Original source on GitHub

Back to Paper IX: Arithmetic Packets, Dyadic Towers, and Local Polynomial Deformation