Paper IV · Lean source

ParameterThetaCompletion.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.

Local imports (2)

KomorebiPaperIV/ParameterThetaCompletion.lean1000 lines

Original source pathPaper_IV_Verification_Closeout_v1.1.0/formalization/lean/KomorebiPaperIV/ParameterThetaCompletion.lean
Skip declarations and read code

Skip source text

1 /-
2 Copyright (c) 2026 Komorebi P. All rights reserved.
3 Authors: Komorebi P.
4 -/
5 
6 import KomorebiPaperIV.AlgebraicCompletion
7 import KomorebiPaperIV.ThetaCore
8 import Mathlib.Algebra.Polynomial.Eval.Defs
9 import Mathlib.Algebra.Polynomial.Degree.Operations
10 
11 /-!
12 # Parameter and theta completion for Paper IV
13 
14 This file supplies manuscript-facing arbitrary-parameter versions of the
15 normalized-residue reciprocal and Appell constructions.  It also packages the
16 theta coefficients as honest polynomials in the parameter and proves the
17 formal Newton recurrence.
18 -/
19 
20 namespace Komorebi.PaperIV
21 
22 open scoped PowerSeries
23 
24 noncomputable section
25 
26 section Naturality
27 
28 variable {R S : Type*} [CommRing R] [Algebra ℚ R]
29   [CommRing S] [Algebra ℚ S]
30 
31 /-- A normalized residue section over an arbitrary rational algebra.  This is
32 the rational-coefficient form of `normalizedResidueSection`. -/
33 def normalizedResidueSectionAlg (N j : ℕ) : R⟦X⟧ :=
34   PowerSeries.mk fun n =>
35     algebraMap ℚ R ((j.factorial : ℚ) / ((N * n + j).factorial : ℚ))
36 
37 @[simp]
38 theorem coeff_normalizedResidueSectionAlg (N j n : ℕ) :
39     PowerSeries.coeff n (normalizedResidueSectionAlg (R := R) N j) =
40       algebraMap ℚ R
41         ((j.factorial : ℚ) / ((N * n + j).factorial : ℚ)) := by
42   simp [normalizedResidueSectionAlg]
43 
44 @[simp]
45 theorem constantCoeff_normalizedResidueSectionAlg (N j : ℕ) :
46     (normalizedResidueSectionAlg (R := R) N j).constantCoeff = 1 := by
47   rw [← PowerSeries.coeff_zero_eq_constantCoeff]
48   rw [coeff_normalizedResidueSectionAlg]
49   simp only [Nat.mul_zero, zero_add]
50   have hj : (j.factorial : ℚ) ≠ 0 := by positivity
51   rw [div_self hj, map_one]
52 
53 theorem normalizedResidueSectionAlg_eq_normalizedResidueSection
54     {K : Type*} [Field K] [CharZero K] (N j : ℕ) :
55     normalizedResidueSectionAlg (R := K) N j =
56       normalizedResidueSection (K := K) N j := by
57   ext n
58   rw [coeff_normalizedResidueSectionAlg, coeff_normalizedResidueSection]
59   simp
60 
61 theorem map_normalizedResidueSectionAlg (φ : R →ₐ[ℚ] S) (N j : ℕ) :
62     PowerSeries.map (φ : R →+* S) (normalizedResidueSectionAlg (R := R) N j) =
63       normalizedResidueSectionAlg (R := S) N j := by
64   ext n
65   simp
66 
67 /-- Formal negative logarithm of the normalized residue section. -/
68 def normalizedResidueNegativeLog (N j : ℕ) : R⟦X⟧ :=
69   -PowerSeries.logOf (normalizedResidueSectionAlg (R := R) N j)
70 
71 @[simp]
72 theorem constantCoeff_normalizedResidueNegativeLog (N j : ℕ) :
73     (normalizedResidueNegativeLog (R := R) N j).constantCoeff = 0 := by
74   simp [normalizedResidueNegativeLog,
75     PowerSeries.constantCoeff_logOf,
76     constantCoeff_normalizedResidueSectionAlg]
77 
78 /-- `logOf` commutes with morphisms of rational algebras on unit-constant
79 series. -/
80 theorem map_logOf_of_constantCoeff_one (φ : R →ₐ[ℚ] S) {f : R⟦X⟧}
81     (hf : f.constantCoeff = 1) :
82     PowerSeries.map (φ : R →+* S) (PowerSeries.logOf f) =
83       PowerSeries.logOf (PowerSeries.map (φ : R →+* S) f) := by
84   rw [PowerSeries.logOf_eq, PowerSeries.logOf_eq]
85   have hzero : (f - 1).constantCoeff = 0 := by simp [hf]
86   let hsub : PowerSeries.HasSubst (f - 1) :=
87     PowerSeries.HasSubst.of_constantCoeff_zero' hzero
88   change ((PowerSeries.log R).subst (f - 1)).map (φ : R →+* S) = _
89   rw [PowerSeries.map_subst hsub]
90   rw [PowerSeries.map_log]
91   have hmap : MvPowerSeries.map (φ : R →+* S) (f - 1) =
92       PowerSeries.map (φ : R →+* S) f - 1 := by
93     rw [map_sub, map_one]
94     rfl
95   rw [hmap]
96 
97 theorem map_normalizedResidueNegativeLog (φ : R →ₐ[ℚ] S) (N j : ℕ) :
98     PowerSeries.map (φ : R →+* S)
99         (normalizedResidueNegativeLog (R := R) N j) =
100       normalizedResidueNegativeLog (R := S) N j := by
101   rw [normalizedResidueNegativeLog, normalizedResidueNegativeLog, map_neg,
102     map_logOf_of_constantCoeff_one φ
103       (constantCoeff_normalizedResidueSectionAlg (R := R) N j),
104     map_normalizedResidueSectionAlg]
105 
106 /-- Naturality of a zero-constant formal exponential parameter family. -/
107 theorem map_formalExpFamily (φ : R →ₐ[ℚ] S) {L : R⟦X⟧}
108     (hL : L.constantCoeff = 0) (r : R) :
109     PowerSeries.map (φ : R →+* S) (formalExpFamily L r) =
110       formalExpFamily (PowerSeries.map (φ : R →+* S) L) (φ r) := by
111   let hsub : PowerSeries.HasSubst L :=
112     PowerSeries.HasSubst.of_constantCoeff_zero' hL
113   rw [formalExpFamily, formalExpFamily]
114   change ((PowerSeries.rescale r (PowerSeries.exp R)).subst L).map
115       (φ : R →+* S) = _
116   rw [PowerSeries.map_subst hsub]
117   rw [← PowerSeries.rescale_map (φ : R →+* S), PowerSeries.map_exp]
118   have hmap : MvPowerSeries.map (φ : R →+* S) L =
119       PowerSeries.map (φ : R →+* S) L := rfl
120   rw [hmap]
121   rfl
122 
123 @[simp]
124 theorem constantCoeff_formalExpFamily_of_zero {L : R⟦X⟧}
125     (hL : L.constantCoeff = 0) (r : R) :
126     (formalExpFamily L r).constantCoeff = 1 := by
127   rw [formalExpFamily]
128   change MvPowerSeries.constantCoeff
129       ((PowerSeries.rescale r (PowerSeries.exp R)).subst L) = 1
130   rw [PowerSeries.constantCoeff_subst_of_constantCoeff_zero hL]
131   rw [← PowerSeries.coeff_zero_eq_constantCoeff, PowerSeries.coeff_rescale]
132   simp
133 
134 end Naturality
135 
136 section ResidueParameter
137 
138 variable {R : Type*} [CommRing R] [Algebra ℚ R]
139 
140 /-- The exact formal family `Phi_(N,j)(w)^(-r)`. -/
141 def residuePowerSeries (N j : ℕ) (r : R) : R⟦X⟧ :=
142   formalExpFamily (normalizedResidueNegativeLog (R := R) N j) r
143 
144 @[simp]
145 theorem constantCoeff_residuePowerSeries (N j : ℕ) (r : R) :
146     (residuePowerSeries N j r).constantCoeff = 1 := by
147   rw [residuePowerSeries, formalExpFamily]
148   change MvPowerSeries.constantCoeff
149       ((PowerSeries.rescale r (PowerSeries.exp R)).subst
150         (normalizedResidueNegativeLog N j)) = 1
151   rw [PowerSeries.constantCoeff_subst_of_constantCoeff_zero
152     (constantCoeff_normalizedResidueNegativeLog N j)]
153   rw [← PowerSeries.coeff_zero_eq_constantCoeff, PowerSeries.coeff_rescale]
154   simp
155 
156 @[simp]
157 theorem residuePowerSeries_zero (N j : ℕ) :
158     residuePowerSeries (R := R) N j 0 = 1 := by
159   exact formalExpFamily_zero (constantCoeff_normalizedResidueNegativeLog N j)
160 
161 theorem residuePowerSeries_neg_one (N j : ℕ) :
162     residuePowerSeries (R := R) N j (-1) =
163       normalizedResidueSectionAlg N j := by
164   rw [residuePowerSeries,
165     formalExpFamily_eq_exp_subst
166       (constantCoeff_normalizedResidueNegativeLog (R := R) N j)]
167   rw [normalizedResidueNegativeLog]
168   have h := exp_subst_logOf
169     (constantCoeff_normalizedResidueSectionAlg (R := R) N j)
170   simpa using h
171 
172 theorem residuePowerSeries_add (N j : ℕ) (r s : R) :
173     residuePowerSeries N j r * residuePowerSeries N j s =
174       residuePowerSeries N j (r + s) := by
175   exact formalExpFamily_semigroup
176     (constantCoeff_normalizedResidueNegativeLog N j) r s
177 
178 theorem map_residuePowerSeries {S : Type*} [CommRing S] [Algebra ℚ S]
179     (φ : R →ₐ[ℚ] S) (N j : ℕ) (r : R) :
180     PowerSeries.map (φ : R →+* S) (residuePowerSeries N j r) =
181       residuePowerSeries N j (φ r) := by
182   rw [residuePowerSeries, map_formalExpFamily φ
183     (constantCoeff_normalizedResidueNegativeLog N j),
184     map_normalizedResidueNegativeLog]
185   rfl
186 
187 section Field
188 
189 variable {K : Type*} [Field K] [CharZero K]
190 
191 theorem residuePowerSeries_one_eq_inverse (N j : ℕ) :
192     residuePowerSeries (R := K) N j 1 =
193       (normalizedResidueSectionAlg N j)⁻¹ := by
194   apply (PowerSeries.eq_inv_iff_mul_eq_one
195     (by simp : (normalizedResidueSectionAlg (R := K) N j).constantCoeff ≠ 0)).2
196   rw [← residuePowerSeries_neg_one (R := K) N j]
197   rw [residuePowerSeries_add, add_neg_cancel, residuePowerSeries_zero]
198 
199 end Field
200 
201 /-- Paper IV's arbitrary-order coefficient `C_(N,j,n)(r)`. -/
202 def residuePowerCoeff (N j n : ℕ) (r : R) : R :=
203   blockCoeff N n (residuePowerSeries N j r)
204 
205 @[simp]
206 theorem residuePowerCoeff_zero (N j : ℕ) (r : R) :
207     residuePowerCoeff N j 0 r = 1 := by
208   simp [residuePowerCoeff, blockCoeff]
209 
210 theorem residuePowerCoeff_addition (N j n : ℕ) (r s : R) :
211     residuePowerCoeff N j n (r + s) =
212       ∑ q ∈ Finset.range (n + 1),
213         ((N * n).choose (N * q) : R) *
214           residuePowerCoeff N j q r * residuePowerCoeff N j (n - q) s := by
215   exact reciprocal_block_convolution
216     (constantCoeff_normalizedResidueNegativeLog N j) N n r s
217 
218 theorem residuePowerCoeff_one_eq_residueInverseCoeff
219     {K : Type*} [Field K] [CharZero K] (N j n : ℕ) :
220     residuePowerCoeff (R := K) N j n 1 =
221       residueInverseCoeff (K := K) N j n := by
222   rw [residuePowerCoeff, residueInverseCoeff,
223     residuePowerSeries_one_eq_inverse,
224     normalizedResidueSectionAlg_eq_normalizedResidueSection]
225   rfl
226 
227 section PolynomialParameter
228 
229 variable {K : Type*} [Field K] [CharZero K]
230 
231 /-- The coefficient `C_(N,j,n)(r)` lifted to an honest polynomial in `r`. -/
232 def residuePowerCoeffPolynomial (N j n : ℕ) : Polynomial K :=
233   residuePowerCoeff (R := Polynomial K) N j n Polynomial.X
234 
235 /-- Evaluation of the polynomial lift recovers the arbitrary scalar
236 parameter coefficient. -/
237 theorem eval_residuePowerCoeffPolynomial (N j n : ℕ) (r : K) :
238     (residuePowerCoeffPolynomial (K := K) N j n).eval r =
239       residuePowerCoeff (R := K) N j n r := by
240   let φ : Polynomial K →ₐ[ℚ] K :=
241     (Polynomial.aeval r).restrictScalars ℚ
242   change φ (residuePowerCoeff
243       (R := Polynomial K) N j n Polynomial.X) = _
244   rw [residuePowerCoeff, residuePowerCoeff, blockCoeff, blockCoeff]
245   simp only [map_mul, map_natCast]
246   congr 1
247   change PowerSeries.coeff n
248       (PowerSeries.map (φ : Polynomial K →+* K)
249         (residuePowerSeries N j Polynomial.X)) = _
250   rw [map_residuePowerSeries φ]
251   simp [φ]
252 
253 /-- Coefficients of `exp (X L)` have parameter degree at most their series
254 index when the coefficients of `L` are scalar constants. -/
255 theorem natDegree_coeff_formalExpFamily_map_C_le
256     (L : K⟦X⟧) (hL : L.constantCoeff = 0) (n : ℕ) :
257     (PowerSeries.coeff n
258       (formalExpFamily (PowerSeries.map Polynomial.C L) Polynomial.X)).natDegree ≤ n := by
259   induction n using Nat.strong_induction_on with
260   | h n ih =>
261       cases n with
262       | zero =>
263           rw [PowerSeries.coeff_zero_eq_constantCoeff]
264           rw [constantCoeff_formalExpFamily_of_zero]
265           · simp
266           · change Polynomial.C (PowerSeries.constantCoeff L) = 0
267             rw [hL, map_zero]
268       | succ k =>
269           let LC : (Polynomial K)⟦X⟧ := PowerSeries.map Polynomial.C L
270           have hLC : LC.constantCoeff = 0 := by
271             change Polynomial.C (PowerSeries.constantCoeff L) = 0
272             rw [hL, map_zero]
273           have hrec := formalExpFamily_coefficient_recurrence
274             hLC Polynomial.X k
275           have hsum :
276               (∑ p ∈ Finset.antidiagonal k,
277                 PowerSeries.coeff p.1 (formalExpFamily LC Polynomial.X) *
278                   ((p.2 + 1 : Polynomial K) *
279                     PowerSeries.coeff (p.2 + 1) LC)).natDegree ≤ k := by
280             apply Polynomial.natDegree_sum_le_of_forall_le
281             intro p hp
282             have hpadd : p.1 + p.2 = k := Finset.mem_antidiagonal.mp hp
283             have hp_lt : p.1 < k + 1 := by omega
284             have hpdeg :
285                 (PowerSeries.coeff p.1
286                   (formalExpFamily LC Polynomial.X)).natDegree ≤ p.1 := by
287               simpa [LC] using ih p.1 hp_lt
288             have hconst :
289                 (((p.2 + 1 : Polynomial K) *
290                   PowerSeries.coeff (p.2 + 1) LC)).natDegree ≤ 0 := by
291               have ha : (p.2 + 1 : Polynomial K).natDegree ≤ 0 := by
292                 change (Polynomial.C (p.2 : K) + Polynomial.C 1).natDegree ≤ 0
293                 rw [← map_add]
294                 simp
295               have hb : (PowerSeries.coeff (p.2 + 1) LC).natDegree ≤ 0 := by
296                 rw [show PowerSeries.coeff (p.2 + 1) LC =
297                     Polynomial.C (PowerSeries.coeff (p.2 + 1) L) by
298                       simp [LC]]
299                 simp
300               exact Polynomial.natDegree_mul_le_of_le ha hb
301             exact (Polynomial.natDegree_mul_le_of_le hpdeg hconst).trans (by omega)
302           have hrhs :
303               (Polynomial.X *
304                 ∑ p ∈ Finset.antidiagonal k,
305                   PowerSeries.coeff p.1 (formalExpFamily LC Polynomial.X) *
306                     ((p.2 + 1 : Polynomial K) *
307                       PowerSeries.coeff (p.2 + 1) LC)).natDegree ≤ k + 1 := by
308             exact (Polynomial.natDegree_mul_le_of_le Polynomial.natDegree_X_le hsum).trans
309               (by omega)
310           have hscalar : (k + 1 : Polynomial K) =
311               Polynomial.C (k + 1 : K) := by simp
312           have hscalar_ne : (k + 1 : K) ≠ 0 := by
313             exact_mod_cast Nat.succ_ne_zero k
314           rw [hscalar] at hrec
315           have hdeg_left :
316               (Polynomial.C (k + 1 : K) *
317                 PowerSeries.coeff (k + 1)
318                   (formalExpFamily LC Polynomial.X)).natDegree =
319                 (PowerSeries.coeff (k + 1)
320                   (formalExpFamily LC Polynomial.X)).natDegree := by
321             rw [Polynomial.natDegree_C_mul hscalar_ne]
322           rw [← hdeg_left]
323           rw [hrec]
324           simpa only [LC] using hrhs
325 
326 /-- The top parameter coefficient of `exp (X L)` comes only from the nth
327 power of the linear term of `L`. -/
328 theorem coeff_parameterDegree_formalExpFamily_map_C
329     (L : K⟦X⟧) (hL : L.constantCoeff = 0) (n : ℕ) :
330     (PowerSeries.coeff n
331       (formalExpFamily (PowerSeries.map Polynomial.C L) Polynomial.X)).coeff n =
332       (PowerSeries.coeff 1 L) ^ n / (n.factorial : K) := by
333   induction n with
334   | zero =>
335       rw [PowerSeries.coeff_zero_eq_constantCoeff,
336         constantCoeff_formalExpFamily_of_zero]
337       · simp
338       · change Polynomial.C (PowerSeries.constantCoeff L) = 0
339         rw [hL, map_zero]
340   | succ k ih =>
341       let LC : (Polynomial K)⟦X⟧ := PowerSeries.map Polynomial.C L
342       have hLC : LC.constantCoeff = 0 := by
343         change Polynomial.C (PowerSeries.constantCoeff L) = 0
344         rw [hL, map_zero]
345       have hrec := formalExpFamily_coefficient_recurrence
346         hLC Polynomial.X k
347       rw [Finset.Nat.sum_antidiagonal_eq_sum_range_succ_mk] at hrec
348       have hsumCoeff :
349           (fun p : Polynomial K => p.coeff k)
350               (∑ q ∈ Finset.range (k + 1),
351                 PowerSeries.coeff q (formalExpFamily LC Polynomial.X) *
352                   ((((k - q : ℕ) : Polynomial K) + 1) *
353                     PowerSeries.coeff (k - q + 1) LC)) =
354             (PowerSeries.coeff k
355               (formalExpFamily LC Polynomial.X)).coeff k *
356                 PowerSeries.coeff 1 L := by
357         change
358           (∑ q ∈ Finset.range (k + 1),
359             PowerSeries.coeff q (formalExpFamily LC Polynomial.X) *
360               ((((k - q : ℕ) : Polynomial K) + 1) *
361                 PowerSeries.coeff (k - q + 1) LC)).coeff k = _
362         rw [Polynomial.finsetSum_coeff, Finset.sum_range_succ]
363         have hvanish :
364             ∑ q ∈ Finset.range k,
365                 (fun p : Polynomial K => p.coeff k)
366                   (PowerSeries.coeff q (formalExpFamily LC Polynomial.X) *
367                     ((((k - q : ℕ) : Polynomial K) + 1) *
368                       PowerSeries.coeff (k - q + 1) LC)) = 0 := by
369           apply Finset.sum_eq_zero
370           intro q hq
371           have hqk : q < k := Finset.mem_range.mp hq
372           have hqdeg :
373               (PowerSeries.coeff q
374                 (formalExpFamily LC Polynomial.X)).natDegree ≤ q := by
375             simpa [LC] using natDegree_coeff_formalExpFamily_map_C_le L hL q
376           have hconst :
377               (((((k - q : ℕ) : Polynomial K) + 1) *
378                 PowerSeries.coeff (k - q + 1) LC)).natDegree ≤ 0 := by
379             have ha : (((k - q : ℕ) : Polynomial K) + 1).natDegree ≤ 0 := by
380               simp
381             have hb :
382                 (PowerSeries.coeff (k - q + 1) LC).natDegree ≤ 0 := by
383               rw [show PowerSeries.coeff (k - q + 1) LC =
384                   Polynomial.C (PowerSeries.coeff (k - q + 1) L) by
385                     simp [LC]]
386               simp
387             exact Polynomial.natDegree_mul_le_of_le ha hb
388           exact Polynomial.coeff_eq_zero_of_natDegree_lt
389             ((Polynomial.natDegree_mul_le_of_le hqdeg hconst).trans_lt (by omega))
390         rw [hvanish, zero_add]
391         simp only [Nat.sub_self, zero_add]
392         rw [show PowerSeries.coeff 1 LC =
393             Polynomial.C (PowerSeries.coeff 1 L) by simp [LC]]
394         simp [Polynomial.coeff_mul_C]
395       have hpoly := congrArg (fun p : Polynomial K => p.coeff (k + 1)) hrec
396       rw [show (k + 1 : Polynomial K) =
397           Polynomial.C (k + 1 : K) by simp,
398         Polynomial.coeff_C_mul, Polynomial.coeff_X_mul] at hpoly
399       simp only [Nat.succ_eq_add_one] at hpoly
400       have hsumCoeffEq :
401           (∑ q ∈ Finset.range (k + 1),
402             PowerSeries.coeff q (formalExpFamily LC Polynomial.X) *
403               ((((k - q : ℕ) : Polynomial K) + 1) *
404                 PowerSeries.coeff (k - q + 1) LC)).coeff k =
405             (PowerSeries.coeff k
406               (formalExpFamily LC Polynomial.X)).coeff k *
407                 PowerSeries.coeff 1 L := hsumCoeff
408       rw [hsumCoeffEq] at hpoly
409       change (k + 1 : K) *
410           (PowerSeries.coeff (k + 1)
411             (formalExpFamily LC Polynomial.X)).coeff (k + 1) = _ at hpoly
412       rw [show PowerSeries.coeff k (formalExpFamily LC Polynomial.X) =
413           PowerSeries.coeff k
414             (formalExpFamily (PowerSeries.map Polynomial.C L) Polynomial.X) by rfl,
415         ih] at hpoly
416       rw [show PowerSeries.coeff (k + 1)
417           (formalExpFamily (PowerSeries.map Polynomial.C L) Polynomial.X) =
418           PowerSeries.coeff (k + 1)
419             (formalExpFamily LC Polynomial.X) by rfl]
420       have hfac : (k.factorial : K) ≠ 0 := by
421         exact_mod_cast k.factorial_pos.ne'
422       have hsuccfac : ((k + 1).factorial : K) ≠ 0 := by
423         exact_mod_cast (k + 1).factorial_pos.ne'
424       apply (eq_div_iff hsuccfac).2
425       rw [Nat.factorial_succ, Nat.cast_mul]
426       rw [Nat.cast_add, Nat.cast_one]
427       calc
428         (PowerSeries.coeff (k + 1)
429               (formalExpFamily LC Polynomial.X)).coeff (k + 1) *
430             ((k + 1 : K) * (k.factorial : K)) =
431           ((k + 1 : K) *
432             (PowerSeries.coeff (k + 1)
433               (formalExpFamily LC Polynomial.X)).coeff (k + 1)) *
434                 (k.factorial : K) := by ring
435         _ = (((PowerSeries.coeff 1 L) ^ k / (k.factorial : K)) *
436               PowerSeries.coeff 1 L) * (k.factorial : K) := by rw [hpoly]
437         _ = (PowerSeries.coeff 1 L) ^ (k + 1) := by
438           rw [pow_succ]
439           field_simp
440 
441 theorem coeff_one_logOf_of_constantCoeff_one {f : K⟦X⟧}
442     (hf : f.constantCoeff = 1) :
443     PowerSeries.coeff 1 (PowerSeries.logOf f) = PowerSeries.coeff 1 f := by
444   have h := congrArg (PowerSeries.coeff (R := K) 0)
445     (mul_derivative_logOf hf)
446   rw [PowerSeries.coeff_mul, Finset.Nat.antidiagonal_zero] at h
447   simp [PowerSeries.coeff_derivative, hf] at h
448   exact h
449 
450 theorem coeff_one_normalizedResidueNegativeLog (N j : ℕ) :
451     PowerSeries.coeff 1 (normalizedResidueNegativeLog (R := K) N j) =
452       -(j.factorial : K) / ((N + j).factorial : K) := by
453   rw [normalizedResidueNegativeLog, map_neg,
454     coeff_one_logOf_of_constantCoeff_one
455       (constantCoeff_normalizedResidueSectionAlg (R := K) N j),
456     coeff_normalizedResidueSectionAlg]
457   simp only [Nat.mul_one]
458   rw [show N + j = N * 1 + j by simp]
459   simp
460   ring
461 
462 /-- Exact leading coefficient asserted in Theorem 9.4. -/
463 theorem coeff_residuePowerCoeffPolynomial_parameterDegree (N j n : ℕ) :
464     (residuePowerCoeffPolynomial (K := K) N j n).coeff n =
465       ((N * n).factorial : K) / (n.factorial : K) *
466         (-(j.factorial : K) / ((N + j).factorial : K)) ^ n := by
467   let L : K⟦X⟧ := normalizedResidueNegativeLog (R := K) N j
468   let Cφ : K →ₐ[ℚ] Polynomial K :=
469     (Polynomial.CAlgHom : K →ₐ[K] Polynomial K).restrictScalars ℚ
470   have hmapL : PowerSeries.map (Cφ : K →+* Polynomial K) L =
471       normalizedResidueNegativeLog (R := Polynomial K) N j := by
472     simpa [L, Cφ] using map_normalizedResidueNegativeLog Cφ N j
473   have hmapC : PowerSeries.map (Cφ : K →+* Polynomial K) L =
474       PowerSeries.map Polynomial.C L := by
475     ext q
476     simp [Cφ]
477   rw [residuePowerCoeffPolynomial, residuePowerCoeff, blockCoeff,
478     residuePowerSeries, ← hmapL]
479   rw [show ((N * n).factorial : Polynomial K) =
480       Polynomial.C ((N * n).factorial : K) by simp]
481   rw [hmapC]
482   rw [Polynomial.coeff_C_mul,
483     coeff_parameterDegree_formalExpFamily_map_C L
484       (constantCoeff_normalizedResidueNegativeLog N j),
485     coeff_one_normalizedResidueNegativeLog]
486   field_simp
487 
488 theorem natDegree_residuePowerCoeffPolynomial_le (N j n : ℕ) :
489     (residuePowerCoeffPolynomial (K := K) N j n).natDegree ≤ n := by
490   let L : K⟦X⟧ := normalizedResidueNegativeLog (R := K) N j
491   let Cφ : K →ₐ[ℚ] Polynomial K :=
492     (Polynomial.CAlgHom : K →ₐ[K] Polynomial K).restrictScalars ℚ
493   have hmapL : PowerSeries.map (Cφ : K →+* Polynomial K) L =
494       normalizedResidueNegativeLog (R := Polynomial K) N j := by
495     simpa [L, Cφ] using map_normalizedResidueNegativeLog Cφ N j
496   have hdeg := natDegree_coeff_formalExpFamily_map_C_le L
497     (constantCoeff_normalizedResidueNegativeLog N j) n
498   rw [residuePowerCoeffPolynomial, residuePowerCoeff, blockCoeff,
499     residuePowerSeries, ← hmapL]
500   exact (Polynomial.natDegree_C_mul_le _ _).trans hdeg
501 
502 /-- The parameter degree in Theorem 9.4 is exact. -/
503 theorem natDegree_residuePowerCoeffPolynomial (N j n : ℕ) :
504     (residuePowerCoeffPolynomial (K := K) N j n).natDegree = n := by
505   apply Polynomial.natDegree_eq_of_le_of_coeff_ne_zero
506     (natDegree_residuePowerCoeffPolynomial_le N j n)
507   rw [coeff_residuePowerCoeffPolynomial_parameterDegree]
508   have hNn : ((N * n).factorial : K) ≠ 0 := by
509     exact_mod_cast (N * n).factorial_pos.ne'
510   have hn : (n.factorial : K) ≠ 0 := by
511     exact_mod_cast n.factorial_pos.ne'
512   have hj : (j.factorial : K) ≠ 0 := by
513     exact_mod_cast j.factorial_pos.ne'
514   have hNj : ((N + j).factorial : K) ≠ 0 := by
515     exact_mod_cast (N + j).factorial_pos.ne'
516   exact mul_ne_zero (div_ne_zero hNn hn)
517     (pow_ne_zero n (div_ne_zero (neg_ne_zero.mpr hj) hNj))
518 
519 end PolynomialParameter
520 
521 end ResidueParameter
522 
523 section ResidueAppellParameter
524 
525 variable {R : Type*} [CommRing R] [Algebra ℚ R]
526 
527 /-- The normalized-residue logarithm after the substitution `w = z^N`. -/
528 def expandedResidueNegativeLog (N j : ℕ) (hN : 0 < N) : R⟦X⟧ :=
529   PowerSeries.expand N hN.ne'
530     (normalizedResidueNegativeLog (R := R) N j)
531 
532 @[simp]
533 theorem constantCoeff_expandedResidueNegativeLog (N j : ℕ) (hN : 0 < N) :
534     (expandedResidueNegativeLog (R := R) N j hN).constantCoeff = 0 := by
535   simp [expandedResidueNegativeLog]
536 
537 /-- Expanding the reduced arbitrary-order reciprocal commutes with its formal
538 exponential construction. -/
539 theorem expand_residuePowerSeries (N j : ℕ) (hN : 0 < N) (r : R) :
540     PowerSeries.expand N hN.ne' (residuePowerSeries N j r) =
541       formalExpFamily (expandedResidueNegativeLog N j hN) r := by
542   rw [residuePowerSeries, formalExpFamily, expandedResidueNegativeLog]
543   let hsub : PowerSeries.HasSubst
544       (normalizedResidueNegativeLog (R := R) N j) :=
545     PowerSeries.HasSubst.of_constantCoeff_zero'
546       (constantCoeff_normalizedResidueNegativeLog N j)
547   exact PowerSeries.expand_subst N hN.ne' hsub
548     (PowerSeries.rescale r (PowerSeries.exp R))
549 
550 /-- The EGF coefficients of the expanded reciprocal are precisely the sparse
551 block sequence attached to `C_(N,j,n)(r)`. -/
552 theorem egfCoeff_expand_residuePowerSeries (N j q : ℕ) (hN : 0 < N)
553     (r : R) :
554     egfCoeff q (PowerSeries.expand N hN.ne' (residuePowerSeries N j r)) =
555       blockCoefficientSequence N (fun n => residuePowerCoeff N j n r) q := by
556   by_cases hdvd : N ∣ q
557   · have hmul : N * (q / N) = q := Nat.mul_div_cancel' hdvd
558     simp [egfCoeff, blockCoefficientSequence, residuePowerCoeff, blockCoeff,
559       PowerSeries.coeff_expand, hdvd, hmul]
560   · simp [egfCoeff, blockCoefficientSequence, PowerSeries.coeff_expand, hdvd]
561 
562 /-- The exact arbitrary-order residue Appell polynomial
563 `E_m^(N,j,r)(x)`. -/
564 def residueAppellPolynomialParam (N j : ℕ) (hN : 0 < N)
565     (r : R) (m : ℕ) : Polynomial R :=
566   formalAppellPolynomial (expandedResidueNegativeLog N j hN) r m
567 
568 theorem residueAppellPolynomialParam_eq_block (N j : ℕ) (hN : 0 < N)
569     (r : R) (m : ℕ) :
570     residueAppellPolynomialParam N j hN r m =
571       appellPolynomial
572         (blockCoefficientSequence N (fun n => residuePowerCoeff N j n r)) m := by
573   rw [residueAppellPolynomialParam, formalAppellPolynomial]
574   congr 1
575   funext q
576   rw [← expand_residuePowerSeries N j hN r]
577   exact egfCoeff_expand_residuePowerSeries N j q hN r
578 
579 /-- The manuscript's finite explicit sum, now specialized at arbitrary
580 reciprocal order `r`. -/
581 theorem residueAppellPolynomialParam_explicit (N j : ℕ) (hN : 0 < N)
582     (r : R) (m : ℕ) :
583     residueAppellPolynomialParam N j hN r m =
584       ∑ n ∈ Finset.range (m / N + 1),
585         Polynomial.C
586             ((m.choose (N * n) : R) * residuePowerCoeff N j n r) *
587           Polynomial.X ^ (m - N * n) := by
588   rw [residueAppellPolynomialParam_eq_block]
589   exact appellPolynomial_eq_block_sum N m hN _
590 
591 /-- Exact Appell lowering law for every residue order. -/
592 theorem derivative_residueAppellPolynomialParam (N j : ℕ) (hN : 0 < N)
593     (r : R) (m : ℕ) :
594     Polynomial.derivative (residueAppellPolynomialParam N j hN r (m + 1)) =
595       Polynomial.C (m + 1 : R) * residueAppellPolynomialParam N j hN r m := by
596   exact derivative_formalAppellPolynomial
597     (expandedResidueNegativeLog N j hN) r m
598 
599 /-- Exact Appell translation law in the manuscript's arbitrary-order
600 normalized-residue specialization. -/
601 theorem eval_residueAppellPolynomialParam_add (N j : ℕ) (hN : 0 < N)
602     (r x y : R) (m : ℕ) :
603     (residueAppellPolynomialParam N j hN r m).eval (x + y) =
604       ∑ p ∈ Finset.antidiagonal m,
605         (m.choose p.1 : R) *
606           (residueAppellPolynomialParam N j hN r p.1).eval x * y ^ p.2 := by
607   let L : R⟦X⟧ := expandedResidueNegativeLog N j hN
608   have hL : L.constantCoeff = 0 := by simp [L]
609   have h := appell_addition hL r x y m
610   simpa [residueAppellPolynomialParam, L, eval_formalAppellPolynomial] using h
611 
612 /-- Exact joint convolution in space and residue order. -/
613 theorem eval_residueAppellPolynomialParam_two_parameter
614     (N j : ℕ) (hN : 0 < N) (r s x y : R) (m : ℕ) :
615     (residueAppellPolynomialParam N j hN (r + s) m).eval (x + y) =
616       ∑ p ∈ Finset.antidiagonal m,
617         (m.choose p.1 : R) *
618           (residueAppellPolynomialParam N j hN r p.1).eval x *
619           (residueAppellPolynomialParam N j hN s p.2).eval y := by
620   let L : R⟦X⟧ := expandedResidueNegativeLog N j hN
621   have hL : L.constantCoeff = 0 := by simp [L]
622   have h := appell_two_parameter_convolution hL r s x y m
623   simpa [residueAppellPolynomialParam, L, eval_formalAppellPolynomial] using h
624 
625 /-- The arbitrary-order residue Appell polynomial is monic of exact degree
626 `m`. -/
627 theorem residueAppellPolynomialParam_isMonicOfDegree [Nontrivial R]
628     (N j : ℕ) (hN : 0 < N) (r : R) (m : ℕ) :
629     Polynomial.IsMonicOfDegree
630       (residueAppellPolynomialParam N j hN r m) m := by
631   rw [residueAppellPolynomialParam_eq_block]
632   apply blockAppellPolynomial_isMonicOfDegree
633   simp [residuePowerCoeff_zero]
634 
635 /-- The exact root-of-unity covariance at arbitrary residue order. -/
636 theorem eval_residueAppellPolynomialParam_covariance
637     (N j : ℕ) (hN : 0 < N) (r ω x : R) (hω : ω ^ N = 1) (m : ℕ) :
638     (residueAppellPolynomialParam N j hN r m).eval (ω * x) =
639       ω ^ m * (residueAppellPolynomialParam N j hN r m).eval x := by
640   rw [residueAppellPolynomialParam_eq_block]
641   exact eval_appellPolynomial_block_covariance N m hN _ ω x hω
642 
643 /-- First half of the differential-operator representation: the arbitrary
644 residue symbol acting on `X^m` is the named Appell polynomial. -/
645 theorem egfConstantCoeffAction_residuePowerSeries_X_pow
646     (N j : ℕ) (hN : 0 < N) (r : R) (m : ℕ) [Nontrivial R] :
647     egfConstantCoeffAction
648         (fun q => egfCoeff q
649           (PowerSeries.expand N hN.ne' (residuePowerSeries N j r)))
650         (Polynomial.X ^ m) =
651       residueAppellPolynomialParam N j hN r m := by
652   rw [egfConstantCoeffAction_X_pow]
653   rw [residueAppellPolynomialParam_eq_block]
654   congr 1
655   funext q
656   exact egfCoeff_expand_residuePowerSeries N j q hN r
657 
658 /-- Arbitrary formal powers with opposite orders give inverse finite
659 differential operators on every polynomial of degree at most `d`. -/
660 theorem truncatedDifferentialOperator_residuePowerSeries_inverse
661     (N j : ℕ) (hN : 0 < N) (r : R) (d : ℕ)
662     {p : Polynomial R} (hp : p.natDegree ≤ d) :
663     (truncatedDifferentialOperator d
664         (PowerSeries.expand N hN.ne' (residuePowerSeries N j (-r))) *
665       truncatedDifferentialOperator d
666         (PowerSeries.expand N hN.ne' (residuePowerSeries N j r))) p = p := by
667   apply truncatedDifferentialOperator_mul_apply_of_natDegree_le hp
668   rw [← map_mul, residuePowerSeries_add, neg_add_cancel,
669     residuePowerSeries_zero, map_one]
670 
671 end ResidueAppellParameter
672 
673 section ThetaPolynomial
674 
675 variable {R S : Type*} [CommRing R] [Algebra ℚ R]
676   [CommRing S] [Algebra ℚ S]
677 
678 theorem map_reducedDenominator (φ : R →ₐ[ℚ] S) (N : ℕ) :
679     PowerSeries.map (φ : R →+* S) (reducedDenominator (R := R) N) =
680       reducedDenominator (R := S) N := by
681   ext n
682   simp [reducedDenominator]
683 
684 theorem map_negativeLogDenominator (φ : R →ₐ[ℚ] S) (N : ℕ) :
685     PowerSeries.map (φ : R →+* S)
686         (negativeLogDenominator (R := R) N) =
687       negativeLogDenominator (R := S) N := by
688   rw [negativeLogDenominator, negativeLogDenominator, map_neg,
689     map_logOf_of_constantCoeff_one φ
690       (constantCoeff_reducedDenominator (R := R) N),
691     map_reducedDenominator]
692 
693 theorem map_reciprocalSeries (φ : R →ₐ[ℚ] S) (N : ℕ) (r : R) :
694     PowerSeries.map (φ : R →+* S) (reciprocalSeries N r) =
695       reciprocalSeries N (φ r) := by
696   rw [reciprocalSeries, map_formalExpFamily φ
697     (constantCoeff_negativeLogDenominator N), map_negativeLogDenominator]
698   rfl
699 
700 theorem map_thetaSeries (φ : R →ₐ[ℚ] S) (N : ℕ) (u : R) :
701     PowerSeries.map (φ : R →+* S) (thetaSeries N u) =
702       thetaSeries N (φ u) := by
703   rw [thetaSeries, thetaSeries, map_mul]
704   rw [← PowerSeries.rescale_map (φ : R →+* S),
705     ← PowerSeries.rescale_map (φ : R →+* S)]
706   rw [map_reciprocalSeries, map_reciprocalSeries]
707   simp
708 
709 section Field
710 
711 variable {K : Type*} [Field K] [CharZero K]
712 
713 /-- Paper IV's theta coefficient as a polynomial in its parameter. -/
714 def thetaPolynomial (N n : ℕ) : Polynomial K :=
715   thetaCoeff (R := Polynomial K) N n Polynomial.X
716 
717 /-- The reciprocal coefficient `P_(N,n)(u)` as a polynomial in `u`. -/
718 def reciprocalCoeffPolynomialOver (N n : ℕ) : Polynomial K :=
719   reciprocalCoeff (R := Polynomial K) N n Polynomial.X
720 
721 theorem eval_reciprocalCoeffPolynomialOver (N n : ℕ) (u : K) :
722     (reciprocalCoeffPolynomialOver (K := K) N n).eval u =
723       reciprocalCoeff (R := K) N n u := by
724   let φ : Polynomial K →ₐ[ℚ] K :=
725     (Polynomial.aeval u).restrictScalars ℚ
726   change φ (reciprocalCoeff
727       (R := Polynomial K) N n Polynomial.X) = _
728   rw [reciprocalCoeff, reciprocalCoeff, blockCoeff, blockCoeff]
729   simp only [map_mul, map_natCast]
730   congr 1
731   change PowerSeries.coeff n
732       (PowerSeries.map (φ : Polynomial K →+* K)
733         (reciprocalSeries N Polynomial.X)) = _
734   rw [map_reciprocalSeries φ]
735   simp [φ]
736 
737 theorem natDegree_reciprocalCoeffPolynomialOver_le (N n : ℕ) :
738     (reciprocalCoeffPolynomialOver (K := K) N n).natDegree ≤ n := by
739   let L : K⟦X⟧ := negativeLogDenominator (R := K) N
740   let Cφ : K →ₐ[ℚ] Polynomial K :=
741     (Polynomial.CAlgHom : K →ₐ[K] Polynomial K).restrictScalars ℚ
742   have hmapL : PowerSeries.map (Cφ : K →+* Polynomial K) L =
743       negativeLogDenominator (R := Polynomial K) N := by
744     simpa [L, Cφ] using map_negativeLogDenominator Cφ N
745   have hdeg := natDegree_coeff_formalExpFamily_map_C_le L
746     (constantCoeff_negativeLogDenominator N) n
747   rw [reciprocalCoeffPolynomialOver, reciprocalCoeff, blockCoeff,
748     reciprocalSeries, ← hmapL]
749   exact (Polynomial.natDegree_C_mul_le _ _).trans hdeg
750 
751 theorem reciprocalCoeff_polynomial_one_eq_C (N n : ℕ) :
752     reciprocalCoeff (R := Polynomial K) N n 1 =
753       Polynomial.C (reciprocalCoeff (R := K) N n 1) := by
754   let Cφ : K →ₐ[ℚ] Polynomial K :=
755     (Polynomial.CAlgHom : K →ₐ[K] Polynomial K).restrictScalars ℚ
756   have hs := congrArg (PowerSeries.coeff (R := Polynomial K) n)
757     (map_reciprocalSeries Cφ N (1 : K))
758   rw [PowerSeries.coeff_map] at hs
759   simp [Cφ] at hs
760   rw [reciprocalCoeff, reciprocalCoeff, blockCoeff, blockCoeff, ← hs]
761   simp
762 
763 theorem eval_thetaPolynomial (N n : ℕ) (u : K) :
764     (thetaPolynomial (K := K) N n).eval u = thetaCoeff N n u := by
765   let φ : Polynomial K →ₐ[ℚ] K :=
766     (Polynomial.aeval u).restrictScalars ℚ
767   change φ (thetaCoeff (R := Polynomial K) N n Polynomial.X) = _
768   rw [thetaCoeff, thetaCoeff, blockCoeff, blockCoeff]
769   simp only [map_mul, map_natCast]
770   congr 1
771   change PowerSeries.coeff n
772       (PowerSeries.map (φ : Polynomial K →+* K)
773         (thetaSeries N Polynomial.X)) = _
774   rw [map_thetaSeries φ]
775   simp [φ]
776 
777 /-- The reconstruction theorem gives the manuscript degree bound on the
778 theta polynomial. -/
779 theorem natDegree_thetaPolynomial_le (N n : ℕ) (hN : 0 < N) :
780     (thetaPolynomial (K := K) N n).natDegree ≤ N * n := by
781   rw [thetaPolynomial, thetaCoeff_reconstruction]
782   have hsum :
783       (∑ q ∈ Finset.range (n + 1),
784         ((N * n).choose (N * q) : Polynomial K) *
785           reciprocalCoeff N q 1 * Polynomial.X ^ (N * q) *
786             reciprocalCoeff N (n - q) Polynomial.X).natDegree ≤ N * n := by
787     apply Polynomial.natDegree_sum_le_of_forall_le
788     intro q hq
789     have hqn : q ≤ n := Nat.le_of_lt_succ (Finset.mem_range.mp hq)
790     have hconstChoose :
791         ((N * n).choose (N * q) : Polynomial K).natDegree ≤ 0 := by simp
792     have hconstOne :
793         (reciprocalCoeff (R := Polynomial K) N q 1).natDegree ≤ 0 := by
794       rw [reciprocalCoeff_polynomial_one_eq_C]
795       simp
796     have hX : (Polynomial.X ^ (N * q) : Polynomial K).natDegree ≤ N * q :=
797       Polynomial.natDegree_X_pow_le (N * q)
798     have hparam :
799         (reciprocalCoeff (R := Polynomial K) N (n - q) Polynomial.X).natDegree ≤
800           n - q := by
801       exact natDegree_reciprocalCoeffPolynomialOver_le N (n - q)
802     have hterm :
803         (((N * n).choose (N * q) : Polynomial K) *
804           reciprocalCoeff N q 1 * Polynomial.X ^ (N * q) *
805             reciprocalCoeff N (n - q) Polynomial.X).natDegree ≤
806           N * q + (n - q) := by
807       have hbase :
808           (((N * n).choose (N * q) : Polynomial K) *
809             reciprocalCoeff N q 1).natDegree ≤ 0 := by
810         simpa using Polynomial.natDegree_mul_le_of_le hconstChoose hconstOne
811       have hwithX :
812           (((N * n).choose (N * q) : Polynomial K) *
813             reciprocalCoeff N q 1 * Polynomial.X ^ (N * q)).natDegree ≤
814               N * q := by
815         simpa using Polynomial.natDegree_mul_le_of_le hbase hX
816       exact Polynomial.natDegree_mul_le_of_le hwithX hparam
817     have hone : 1 ≤ N := hN
818     have hrest : n - q ≤ N * (n - q) := by
819       calc
820         n - q = 1 * (n - q) := by simp
821         _ ≤ N * (n - q) := Nat.mul_le_mul_right (n - q) hone
822     have hsplit : N * q + N * (n - q) = N * n := by
823       rw [← Nat.mul_add, Nat.add_sub_of_le hqn]
824     exact hterm.trans (by omega)
825   have hsign : ((-1 : Polynomial K) ^ n).natDegree ≤ 0 := by
826     have hneg : (-1 : Polynomial K).natDegree ≤ 0 := by simp
827     simpa only [Nat.mul_zero] using Polynomial.natDegree_pow_le_of_le n hneg
828   simpa using Polynomial.natDegree_mul_le_of_le hsign hsum
829 
830 /-- The first trivial theta factor, now as literal polynomial divisibility. -/
831 theorem X_dvd_thetaPolynomial (N n : ℕ) (hN : 0 < N) (hn : 0 < n) :
832     Polynomial.X ∣ thetaPolynomial (K := K) N n := by
833   rw [Polynomial.X_dvd_iff, Polynomial.coeff_zero_eq_eval_zero,
834     eval_thetaPolynomial]
835   exact thetaCoeff_zero_parameter_of_pos N hN hn
836 
837 /-- For even block size, the second trivial theta factor is literal
838 divisibility by `X + 1`. -/
839 theorem X_add_one_dvd_thetaPolynomial_of_even
840     (N n : ℕ) (_hN : 0 < N) (heven : Even N) (hn : 0 < n) :
841     Polynomial.X + 1 ∣ thetaPolynomial (K := K) N n := by
842   have hroot : (thetaPolynomial (K := K) N n).IsRoot (-1) := by
843     rw [Polynomial.IsRoot, eval_thetaPolynomial]
844     exact thetaCoeff_neg_one_of_even_of_pos N heven hn
845   have hdvd := Polynomial.dvd_iff_isRoot.mpr hroot
846   simpa [sub_neg_eq_add] using hdvd
847 
848 end Field
849 
850 end ThetaPolynomial
851 
852 section ThetaNewton
853 
854 variable {R : Type*} [CommRing R] [Algebra ℚ R]
855 
856 omit [Algebra ℚ R] in
857 /-- Formal differentiation commutes with rescaling up to the chain-rule
858 factor. -/
859 theorem derivative_rescale_series (a : R) (f : R⟦X⟧) :
860     PowerSeries.derivative R (PowerSeries.rescale a f) =
861       PowerSeries.C a *
862         PowerSeries.rescale a (PowerSeries.derivative R f) := by
863   ext n
864   rw [PowerSeries.coeff_derivative, PowerSeries.coeff_C_mul,
865     PowerSeries.coeff_rescale, PowerSeries.coeff_rescale,
866     PowerSeries.coeff_derivative, pow_succ]
867   ring
868 
869 omit [Algebra ℚ R] in
870 theorem rescale_C_series (a r : R) :
871     PowerSeries.rescale a (PowerSeries.C r) = PowerSeries.C r := by
872   ext (_ | n)
873   · simp
874   · simp
875 
876 /-- Logarithmic-derivative factor for a rescaled reciprocal family. -/
877 def scaledReciprocalLogDerivative (N : ℕ) (a r : R) : R⟦X⟧ :=
878   PowerSeries.C (a * r) *
879     PowerSeries.rescale a
880       (PowerSeries.derivative R (negativeLogDenominator N))
881 
882 theorem derivative_rescale_reciprocalSeries (N : ℕ) (a r : R) :
883     PowerSeries.derivative R
884         (PowerSeries.rescale a (reciprocalSeries N r)) =
885       PowerSeries.rescale a (reciprocalSeries N r) *
886         scaledReciprocalLogDerivative N a r := by
887   rw [derivative_rescale_series, derivative_reciprocalSeries]
888   rw [map_mul, map_mul]
889   rw [rescale_C_series]
890   rw [scaledReciprocalLogDerivative]
891   rw [map_mul]
892   ring
893 
894 /-- The logarithmic derivative multiplying the theta series. -/
895 def thetaLogDerivativeSeries (N : ℕ) (u : R) : R⟦X⟧ :=
896   scaledReciprocalLogDerivative N (-u ^ N) 1 +
897     scaledReciprocalLogDerivative N (-1) u
898 
899 theorem derivative_thetaSeries (N : ℕ) (u : R) :
900     PowerSeries.derivative R (thetaSeries N u) =
901       thetaSeries N u * thetaLogDerivativeSeries N u := by
902   rw [thetaSeries, thetaLogDerivativeSeries,
903     (PowerSeries.derivative R).leibniz]
904   simp only [smul_eq_mul]
905   rw [
906     derivative_rescale_reciprocalSeries,
907     derivative_rescale_reciprocalSeries]
908   ring
909 
910 @[simp]
911 theorem coeff_thetaLogDerivativeSeries (N k : ℕ) (u : R) :
912     PowerSeries.coeff k (thetaLogDerivativeSeries N u) =
913       (-1 : R) ^ (k + 1) * kappaCoeff N (k + 1) *
914         (u ^ (N * (k + 1)) + u) := by
915   rw [thetaLogDerivativeSeries, map_add, scaledReciprocalLogDerivative,
916     scaledReciprocalLogDerivative, PowerSeries.coeff_C_mul,
917     PowerSeries.coeff_C_mul, PowerSeries.coeff_rescale,
918     PowerSeries.coeff_rescale, PowerSeries.coeff_derivative, kappaCoeff]
919   rw [neg_pow, neg_pow, ← pow_mul]
920   rw [Nat.cast_add, Nat.cast_one]
921   ring
922 
923 /-- Ordinary reduced-variable theta coefficient.  This is the manuscript's
924 `theta_(N,n)(u) = Theta_(N,n)(u)/(Nn)!`. -/
925 def thetaOrdCoeff (N n : ℕ) (u : R) : R :=
926   PowerSeries.coeff n (thetaSeries N u)
927 
928 @[simp]
929 theorem thetaOrdCoeff_zero (N : ℕ) (u : R) :
930     thetaOrdCoeff N 0 u = 1 := by
931   rw [thetaOrdCoeff, thetaSeries, PowerSeries.coeff_mul,
932     Finset.Nat.antidiagonal_zero]
933   simp
934 
935 /-- Theta Newton recurrence in exact antidiagonal indexing.  Replacing
936 `k + 1` by `n` and `p.2 + 1` by `m` gives the displayed manuscript sum
937 from `m = 1` through `m = n`. -/
938 theorem thetaOrdCoeff_newton (N k : ℕ) (u : R) :
939     (k + 1 : R) * thetaOrdCoeff N (k + 1) u =
940       ∑ p ∈ Finset.antidiagonal k,
941         thetaOrdCoeff N p.1 u *
942           ((-1 : R) ^ (p.2 + 1) * kappaCoeff N (p.2 + 1) *
943             (u ^ (N * (p.2 + 1)) + u)) := by
944   have h := congrArg (PowerSeries.coeff (R := R) k)
945     (derivative_thetaSeries (R := R) N u)
946   rw [PowerSeries.coeff_derivative, PowerSeries.coeff_mul] at h
947   simp only [coeff_thetaLogDerivativeSeries] at h
948   simpa [thetaOrdCoeff, mul_comm] using h
949 
950 /-- The normalization of the first logarithmic coefficient used in the
951 closed form for the first theta polynomial. -/
952 theorem factorial_mul_kappaCoeff_one (N : ℕ) :
953     (N.factorial : R) * kappaCoeff N 1 = 1 := by
954   have hlog := mul_derivative_logOf
955     (constantCoeff_reducedDenominator (R := R) N)
956   have hcoeff := congrArg (PowerSeries.coeff (R := R) 0) hlog
957   rw [PowerSeries.coeff_mul, PowerSeries.coeff_derivative] at hcoeff
958   rw [Finset.Nat.antidiagonal_zero] at hcoeff
959   simp at hcoeff
960   have hcoeff' :
961       PowerSeries.coeff 1 (PowerSeries.logOf
962         (reducedDenominator (R := R) N)) =
963         algebraMap ℚ R ((-1 : ℚ) / (N.factorial : ℚ)) := by
964     rw [← hcoeff]
965     rw [← PowerSeries.coeff_zero_eq_constantCoeff,
966       PowerSeries.coeff_derivative]
967     simp
968   rw [kappaCoeff, negativeLogDenominator]
969   simp only [Nat.cast_one, one_mul, map_neg]
970   rw [hcoeff']
971   rw [show (N.factorial : R) =
972     algebraMap ℚ R (N.factorial : ℚ) by simp]
973   rw [← map_neg, ← map_mul]
974   have hfac : (N.factorial : ℚ) ≠ 0 := by positivity
975   field_simp
976   simp
977 
978 /-- The first theta coefficient from Proposition 10.4. -/
979 theorem thetaCoeff_one (N : ℕ) (u : R) :
980     thetaCoeff N 1 u = -(u ^ N + u) := by
981   have hrec := thetaOrdCoeff_newton (R := R) N 0 u
982   simp only [Nat.cast_zero, zero_add, one_mul,
983     Finset.Nat.antidiagonal_zero, Finset.sum_singleton,
984     thetaOrdCoeff_zero, pow_one, Nat.mul_one] at hrec
985   rw [thetaCoeff, blockCoeff]
986   simp only [Nat.mul_one]
987   change (N.factorial : R) * thetaOrdCoeff N 1 u = _
988   rw [hrec]
989   have hk := factorial_mul_kappaCoeff_one (R := R) N
990   calc
991     (N.factorial : R) *
992         ((-1 : R) * kappaCoeff N 1 * (u ^ N + u)) =
993       -((N.factorial : R) * kappaCoeff N 1) * (u ^ N + u) := by ring
994     _ = -(u ^ N + u) := by rw [hk]; ring
995 
996 end ThetaNewton
997 
998 end
999 
1000 end Komorebi.PaperIV

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: c4f6cf8decf012d6e71188a6e8b2f3d9c146323f197195d07a361c6a85f57975

Original source on GitHub

Back to Paper IV: Cyclic Analytic Functions, Reciprocal Families, and Spectral Zero Data