Paper IV · Lean source

ReciprocalCompletion.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 (1)

KomorebiPaperIV/ReciprocalCompletion.lean667 lines

Original source pathPaper_IV_Verification_Closeout_v1.1.0/formalization/lean/KomorebiPaperIV/ReciprocalCompletion.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.ReciprocalCore
7 import Mathlib.Data.Nat.Choose.Cast
8 import Mathlib.Algebra.Polynomial.Eval.Defs
9 
10 /-!
11 # Reciprocal and tangent completion certificates
12 
13 This file strengthens the branch-free algebraic coverage of Sections 7 and 8
14 of Paper IV.  All identities are formal-power-series identities.  In
15 particular, the higher Riccati theorem below uses a recursively defined
16 complete differential Bell polynomial and does not appeal to pointwise
17 division or to an analytic logarithm branch.
18 -/
19 
20 namespace Komorebi.PaperIV
21 
22 open scoped PowerSeries
23 
24 noncomputable section
25 
26 section ParameterRecurrence
27 
28 variable {R : Type*} [CommRing R] [Algebra ℚ R]
29 
30 /-- The denominator times the derivative of its reciprocal parameter family
31 satisfies the exact logarithmic-differentiation equation. -/
32 theorem reducedDenominator_reciprocalSeries_differentialEquation
33     (N : ℕ) (r : R) :
34     reducedDenominator N * PowerSeries.derivative R (reciprocalSeries N r) +
35         PowerSeries.C r *
36           (PowerSeries.derivative R (reducedDenominator N) *
37             reciprocalSeries N r) = 0 := by
38   rw [derivative_reciprocalSeries]
39   have hlog := reducedDenominator_mul_reducedTangentSeries (R := R) N
40   rw [reducedTangentSeries] at hlog
41   calc
42     reducedDenominator N *
43           (PowerSeries.C r * reciprocalSeries N r *
44             PowerSeries.derivative R (negativeLogDenominator N)) +
45         PowerSeries.C r *
46           (PowerSeries.derivative R (reducedDenominator N) *
47             reciprocalSeries N r) =
48         PowerSeries.C r * reciprocalSeries N r *
49           (reducedDenominator N *
50             PowerSeries.derivative R (negativeLogDenominator N)) +
51         PowerSeries.C r * reciprocalSeries N r *
52           PowerSeries.derivative R (reducedDenominator N) := by ring
53     _ = 0 := by rw [hlog]; ring
54 
55 /-- Coefficient form of the parameter recurrence before factorial
56 rescaling.  Multiplying this identity by `N (N(n+1)-1)!` gives the two
57 binomial sums displayed in Theorem 7.3. -/
58 theorem reciprocalOrdCoeff_parameter_equation (N n : ℕ) (r : R) :
59     (∑ p ∈ Finset.antidiagonal n,
60         PowerSeries.coeff p.1 (reducedDenominator (R := R) N) *
61           ((p.2 + 1 : R) * reciprocalOrdCoeff N (p.2 + 1) r)) +
62       r * ∑ p ∈ Finset.antidiagonal n,
63         ((p.1 + 1 : R) *
64           PowerSeries.coeff (p.1 + 1) (reducedDenominator (R := R) N)) *
65             reciprocalOrdCoeff N p.2 r = 0 := by
66   have h := congrArg (PowerSeries.coeff (R := R) n)
67     (reducedDenominator_reciprocalSeries_differentialEquation (R := R) N r)
68   rw [map_add, PowerSeries.coeff_mul, PowerSeries.coeff_C_mul,
69     PowerSeries.coeff_mul] at h
70   simp only [map_zero] at h
71   simp_rw [PowerSeries.coeff_derivative] at h
72   simpa [reciprocalOrdCoeff, mul_assoc, mul_left_comm, mul_comm] using h
73 
74 end ParameterRecurrence
75 
76 section ExactParameterRecurrence
77 
78 variable {K : Type*} [Field K] [CharZero K]
79 
80 private theorem scaled_reducedDenominator_term
81     {N n k : ℕ} (hN : 0 < N) (hk : k < n) :
82     (((N * n - 1).factorial : K) * (N : K)) *
83         (PowerSeries.coeff k (reducedDenominator (R := K) N) *
84           (n - k : K)) =
85       (-1 : K) ^ k * ((N * n - 1).choose (N * k) : K) *
86         ((N * (n - k)).factorial : K) := by
87   have hkn : k ≤ n := Nat.le_of_lt hk
88   have hNkn : 0 < N * (n - k) := Nat.mul_pos hN (Nat.sub_pos_of_lt hk)
89   have hmul_lt : N * k < N * n := (Nat.mul_lt_mul_left hN).2 hk
90   have hmul_le : N * k ≤ N * n := Nat.le_of_lt hmul_lt
91   have hchoose : N * k ≤ N * n - 1 := by omega
92   have hsub : N * n - 1 - N * k = N * (n - k) - 1 := by
93     rw [Nat.mul_sub_left_distrib]
94     omega
95   have hfac :
96       ((N * (n - k)).factorial : K) =
97         (N * (n - k) : K) * ((N * (n - k) - 1).factorial : K) := by
98     exact_mod_cast (Nat.mul_factorial_pred hNkn.ne').symm
99   have hfacNk : ((N * k).factorial : K) ≠ 0 := by
100     exact_mod_cast (N * k).factorial_pos.ne'
101   have hfacRest : ((N * (n - k) - 1).factorial : K) ≠ 0 := by
102     exact_mod_cast (N * (n - k) - 1).factorial_pos.ne'
103   rw [coeff_reducedDenominator]
104   rw [eq_ratCast]
105   push_cast
106   have hsign : ((↑((-1 : ℚ) ^ k) : K)) = (-1 : K) ^ k := by norm_cast
107   rw [hsign]
108   rw [Nat.cast_choose K hchoose, hsub, hfac]
109   field_simp [hfacNk, hfacRest]
110 
111 private theorem scaled_derivative_reducedDenominator_term
112     {N n k : ℕ} (hN : 0 < N) (hk : 0 < k) (hkn : k ≤ n) :
113     (((N * n - 1).factorial : K) * (N : K)) *
114         ((k : K) *
115           PowerSeries.coeff k (reducedDenominator (R := K) N)) =
116       (-1 : K) ^ k * ((N * n - 1).choose (N * k - 1) : K) *
117         ((N * (n - k)).factorial : K) := by
118   have hNk : 0 < N * k := Nat.mul_pos hN hk
119   have hmul_le : N * k ≤ N * n := Nat.mul_le_mul_left N hkn
120   have hchoose : N * k - 1 ≤ N * n - 1 := by omega
121   have hsub : N * n - 1 - (N * k - 1) = N * (n - k) := by
122     rw [Nat.mul_sub_left_distrib]
123     omega
124   have hfac :
125       ((N * k).factorial : K) =
126         (N * k : K) * ((N * k - 1).factorial : K) := by
127     exact_mod_cast (Nat.mul_factorial_pred hNk.ne').symm
128   have hfacNk : ((N * k).factorial : K) ≠ 0 := by
129     exact_mod_cast (N * k).factorial_pos.ne'
130   have hfacPred : ((N * k - 1).factorial : K) ≠ 0 := by
131     exact_mod_cast (N * k - 1).factorial_pos.ne'
132   have hfacRest : ((N * (n - k)).factorial : K) ≠ 0 := by
133     exact_mod_cast (N * (n - k)).factorial_pos.ne'
134   have hN0 : (N : K) ≠ 0 := by exact_mod_cast hN.ne'
135   have hk0 : (k : K) ≠ 0 := by exact_mod_cast hk.ne'
136   rw [coeff_reducedDenominator]
137   rw [eq_ratCast]
138   push_cast
139   have hsign : ((↑((-1 : ℚ) ^ k) : K)) = (-1 : K) ^ k := by norm_cast
140   rw [hsign]
141   rw [Nat.cast_choose K hchoose, hsub, hfac]
142   field_simp [hfacNk, hfacPred, hfacRest, hN0, hk0]
143 
144 private theorem scaled_reciprocalOrdCoeff_term
145     {N n k : ℕ} (hN : 0 < N) (hk : k < n) (r : K) :
146     (((N * n - 1).factorial : K) * (N : K)) *
147         (PowerSeries.coeff k (reducedDenominator (R := K) N) *
148           ((n - k : K) * reciprocalOrdCoeff N (n - k) r)) =
149       (-1 : K) ^ k * ((N * n - 1).choose (N * k) : K) *
150         reciprocalCoeff N (n - k) r := by
151   rw [reciprocalCoeff, blockCoeff, reciprocalOrdCoeff]
152   have hs := scaled_reducedDenominator_term (K := K) hN hk
153   calc
154     (((N * n - 1).factorial : K) * (N : K)) *
155         (PowerSeries.coeff k (reducedDenominator (R := K) N) *
156           ((n - k : K) *
157             PowerSeries.coeff (n - k) (reciprocalSeries N r))) =
158       ((((N * n - 1).factorial : K) * (N : K)) *
159         (PowerSeries.coeff k (reducedDenominator (R := K) N) *
160           (n - k : K))) *
161             PowerSeries.coeff (n - k) (reciprocalSeries N r) := by ring
162     _ = ((-1 : K) ^ k * ((N * n - 1).choose (N * k) : K) *
163         ((N * (n - k)).factorial : K)) *
164           PowerSeries.coeff (n - k) (reciprocalSeries N r) := by rw [hs]
165     _ = (-1 : K) ^ k * ((N * n - 1).choose (N * k) : K) *
166         (((N * (n - k)).factorial : K) *
167           PowerSeries.coeff (n - k) (reciprocalSeries N r)) := by ring
168 
169 private theorem scaled_derivative_reciprocalOrdCoeff_term
170     {N n k : ℕ} (hN : 0 < N) (hk : 0 < k) (hkn : k ≤ n) (r : K) :
171     (((N * n - 1).factorial : K) * (N : K)) *
172         (((k : K) *
173           PowerSeries.coeff k (reducedDenominator (R := K) N)) *
174             reciprocalOrdCoeff N (n - k) r) =
175       (-1 : K) ^ k * ((N * n - 1).choose (N * k - 1) : K) *
176         reciprocalCoeff N (n - k) r := by
177   rw [reciprocalCoeff, blockCoeff, reciprocalOrdCoeff]
178   have hs := scaled_derivative_reducedDenominator_term (K := K) hN hk hkn
179   calc
180     (((N * n - 1).factorial : K) * (N : K)) *
181         (((k : K) *
182           PowerSeries.coeff k (reducedDenominator (R := K) N)) *
183             PowerSeries.coeff (n - k) (reciprocalSeries N r)) =
184       ((((N * n - 1).factorial : K) * (N : K)) *
185         ((k : K) *
186           PowerSeries.coeff k (reducedDenominator (R := K) N))) *
187             PowerSeries.coeff (n - k) (reciprocalSeries N r) := by ring
188     _ = ((-1 : K) ^ k * ((N * n - 1).choose (N * k - 1) : K) *
189         ((N * (n - k)).factorial : K)) *
190           PowerSeries.coeff (n - k) (reciprocalSeries N r) := by rw [hs]
191     _ = (-1 : K) ^ k * ((N * n - 1).choose (N * k - 1) : K) *
192         (((N * (n - k)).factorial : K) *
193           PowerSeries.coeff (n - k) (reciprocalSeries N r)) := by ring
194 
195 /-- Exact factorially normalized coefficient equation behind Theorem 7.3.
196 The second sum uses the reindexing `k = q + 1`, so all displayed indices are
197 total natural-number expressions. -/
198 theorem reciprocalCoeff_parameter_equation
199     {N n : ℕ} (hN : 0 < N) (hn : 0 < n) (r : K) :
200     (∑ k ∈ Finset.range n,
201         (-1 : K) ^ k * ((N * n - 1).choose (N * k) : K) *
202           reciprocalCoeff N (n - k) r) +
203       r * ∑ q ∈ Finset.range n,
204         (-1 : K) ^ (q + 1) *
205           ((N * n - 1).choose (N * (q + 1) - 1) : K) *
206             reciprocalCoeff N (n - (q + 1)) r = 0 := by
207   have hraw := reciprocalOrdCoeff_parameter_equation (R := K) N (n - 1) r
208   rw [Finset.Nat.sum_antidiagonal_eq_sum_range_succ_mk,
209     Finset.Nat.sum_antidiagonal_eq_sum_range_succ_mk] at hraw
210   simp only [Nat.succ_eq_add_one] at hraw
211   have hpred : n - 1 + 1 = n := Nat.sub_add_cancel (Nat.one_le_iff_ne_zero.mpr hn.ne')
212   have hfirst :
213       (∑ k ∈ Finset.range n,
214           PowerSeries.coeff k (reducedDenominator (R := K) N) *
215             ((n - k : K) * reciprocalOrdCoeff N (n - k) r)) =
216         ∑ k ∈ Finset.range (n - 1 + 1),
217           PowerSeries.coeff k (reducedDenominator (R := K) N) *
218             ((((n - 1 - k : ℕ) : K) + 1) *
219               reciprocalOrdCoeff N (n - 1 - k + 1) r) := by
220     rw [hpred]
221     apply Finset.sum_congr rfl
222     intro k hk
223     have hklt : k < n := Finset.mem_range.mp hk
224     have hidx : n - 1 - k + 1 = n - k := by omega
225     have hcast : (((n - 1 - k : ℕ) : K) + 1) = (n - k : K) := by
226       have hc := congrArg (fun m : ℕ => (m : K)) hidx
227       simpa only [Nat.cast_add, Nat.cast_one,
228         Nat.cast_sub (Nat.le_of_lt hklt)] using hc
229     rw [hcast, hidx]
230   have hsecond :
231       (∑ q ∈ Finset.range n,
232           ((q + 1 : K) *
233             PowerSeries.coeff (q + 1) (reducedDenominator (R := K) N)) *
234               reciprocalOrdCoeff N (n - (q + 1)) r) =
235         ∑ q ∈ Finset.range (n - 1 + 1),
236           ((q + 1 : K) *
237             PowerSeries.coeff (q + 1) (reducedDenominator (R := K) N)) *
238               reciprocalOrdCoeff N (n - 1 - q) r := by
239     rw [hpred]
240     apply Finset.sum_congr rfl
241     intro q hq
242     have hqlt : q < n := Finset.mem_range.mp hq
243     have hidx : n - 1 - q = n - (q + 1) := by omega
244     rw [hidx]
245   rw [← hfirst, ← hsecond] at hraw
246   let scale : K := ((N * n - 1).factorial : K) * (N : K)
247   have hscaled :
248       scale *
249         ((∑ k ∈ Finset.range n,
250             PowerSeries.coeff k (reducedDenominator (R := K) N) *
251               ((n - k : K) * reciprocalOrdCoeff N (n - k) r)) +
252           r * ∑ q ∈ Finset.range n,
253             ((q + 1 : K) *
254               PowerSeries.coeff (q + 1) (reducedDenominator (R := K) N)) *
255                 reciprocalOrdCoeff N (n - (q + 1)) r) = 0 := by
256     rw [hraw, mul_zero]
257   have hfirstScaled :
258       scale *
259           (∑ k ∈ Finset.range n,
260             PowerSeries.coeff k (reducedDenominator (R := K) N) *
261               ((n - k : K) * reciprocalOrdCoeff N (n - k) r)) =
262         ∑ k ∈ Finset.range n,
263           (-1 : K) ^ k * ((N * n - 1).choose (N * k) : K) *
264             reciprocalCoeff N (n - k) r := by
265     rw [Finset.mul_sum]
266     apply Finset.sum_congr rfl
267     intro k hk
268     exact scaled_reciprocalOrdCoeff_term (K := K) hN (Finset.mem_range.mp hk) r
269   have hsecondScaled :
270       scale *
271           (∑ q ∈ Finset.range n,
272             ((q + 1 : K) *
273               PowerSeries.coeff (q + 1) (reducedDenominator (R := K) N)) *
274                 reciprocalOrdCoeff N (n - (q + 1)) r) =
275         ∑ q ∈ Finset.range n,
276           (-1 : K) ^ (q + 1) *
277             ((N * n - 1).choose (N * (q + 1) - 1) : K) *
278               reciprocalCoeff N (n - (q + 1)) r := by
279     rw [Finset.mul_sum]
280     apply Finset.sum_congr rfl
281     intro q hq
282     have hqlt : q < n := Finset.mem_range.mp hq
283     simpa [scale, Nat.succ_eq_add_one] using
284       (scaled_derivative_reciprocalOrdCoeff_term
285         (K := K) hN (Nat.zero_lt_succ q) (Nat.succ_le_iff.mpr hqlt) r)
286   calc
287     (∑ k ∈ Finset.range n,
288         (-1 : K) ^ k * ((N * n - 1).choose (N * k) : K) *
289           reciprocalCoeff N (n - k) r) +
290       r * ∑ q ∈ Finset.range n,
291         (-1 : K) ^ (q + 1) *
292           ((N * n - 1).choose (N * (q + 1) - 1) : K) *
293             reciprocalCoeff N (n - (q + 1)) r =
294       scale *
295         ((∑ k ∈ Finset.range n,
296             PowerSeries.coeff k (reducedDenominator (R := K) N) *
297               ((n - k : K) * reciprocalOrdCoeff N (n - k) r)) +
298           r * ∑ q ∈ Finset.range n,
299             ((q + 1 : K) *
300               PowerSeries.coeff (q + 1) (reducedDenominator (R := K) N)) *
301                 reciprocalOrdCoeff N (n - (q + 1)) r) := by
302         rw [mul_add, hfirstScaled]
303         rw [show scale *
304             (r * ∑ q ∈ Finset.range n,
305               ((q + 1 : K) *
306                 PowerSeries.coeff (q + 1) (reducedDenominator (R := K) N)) *
307                   reciprocalOrdCoeff N (n - (q + 1)) r) =
308             r * (scale * ∑ q ∈ Finset.range n,
309               ((q + 1 : K) *
310                 PowerSeries.coeff (q + 1) (reducedDenominator (R := K) N)) *
311                   reciprocalOrdCoeff N (n - (q + 1)) r) by ring,
312           hsecondScaled]
313     _ = 0 := hscaled
314 
315 /-- The solved parameter recurrence, exactly matching Theorem 7.3 after the
316 harmless reindexing `k = q + 1` in the second finite sum. -/
317 theorem reciprocalCoeff_parameter_recurrence
318     {N n : ℕ} (hN : 0 < N) (hn : 0 < n) (r : K) :
319     reciprocalCoeff N n r =
320       -(∑ k ∈ Finset.Ico 1 n,
321           (-1 : K) ^ k * ((N * n - 1).choose (N * k) : K) *
322             reciprocalCoeff N (n - k) r) -
323       r * ∑ q ∈ Finset.range n,
324         (-1 : K) ^ (q + 1) *
325           ((N * n - 1).choose (N * (q + 1) - 1) : K) *
326             reciprocalCoeff N (n - (q + 1)) r := by
327   let f : ℕ → K := fun k =>
328     (-1 : K) ^ k * ((N * n - 1).choose (N * k) : K) *
329       reciprocalCoeff N (n - k) r
330   have hsplit :
331       (∑ k ∈ Finset.range n, f k) =
332         reciprocalCoeff N n r + ∑ k ∈ Finset.Ico 1 n, f k := by
333     have hi := Finset.sum_Ico_eq_sub f (show 1 ≤ n by omega)
334     simp only [Finset.sum_range_one] at hi
335     have hf0 : f 0 = reciprocalCoeff N n r := by simp [f]
336     rw [hi, hf0]
337     ring
338   have h := reciprocalCoeff_parameter_equation (K := K) hN hn r
339   change (∑ k ∈ Finset.range n, f k) + _ = 0 at h
340   rw [hsplit] at h
341   change reciprocalCoeff N n r =
342       -(∑ k ∈ Finset.Ico 1 n, f k) - _
343   linear_combination h
344 
345 @[simp]
346 theorem reciprocalCoeff_block_zero (N : ℕ) (r : K) :
347     reciprocalCoeff N 0 r = 1 := by
348   simp [reciprocalCoeff, blockCoeff]
349 
350 /-- The first reciprocal polynomial: `P_(N,1)(r) = r`. -/
351 theorem reciprocalCoeff_one {N : ℕ} (hN : 0 < N) (r : K) :
352     reciprocalCoeff N 1 r = r := by
353   have h := reciprocalCoeff_parameter_recurrence
354     (K := K) hN (n := 1) (by omega) r
355   simpa using h
356 
357 /-- A recurrence-normal-form certificate for the second reciprocal
358 polynomial.  The two adjacent binomial coefficients combine to the compact
359 formula printed in Corollary 7.7. -/
360 theorem reciprocalCoeff_two_recurrence_form
361     {N : ℕ} (hN : 0 < N) (r : K) :
362     reciprocalCoeff N 2 r =
363       ((2 * N - 1).choose N : K) * r +
364         r * (((2 * N - 1).choose (N - 1) : K) * r - 1) := by
365   have h := reciprocalCoeff_parameter_recurrence
366     (K := K) hN (n := 2) (by omega) r
367   norm_num [Finset.sum_range_succ, Finset.sum_Ico_eq_sub,
368     reciprocalCoeff_one hN] at h
369   rw [Nat.mul_comm N 2] at h
370   linear_combination h
371 
372 /-- A recurrence-normal-form certificate for the third reciprocal
373 polynomial.  Substitution of the preceding second-degree formula and the
374 standard adjacent-binomial identities yields the compact form in
375 Corollary 7.7. -/
376 theorem reciprocalCoeff_three_recurrence_form
377     {N : ℕ} (hN : 0 < N) (r : K) :
378     reciprocalCoeff N 3 r =
379       ((3 * N - 1).choose N : K) * reciprocalCoeff N 2 r -
380         ((3 * N - 1).choose (2 * N) : K) * r +
381       r * (((3 * N - 1).choose (N - 1) : K) * reciprocalCoeff N 2 r -
382         ((3 * N - 1).choose (2 * N - 1) : K) * r + 1) := by
383   have h := reciprocalCoeff_parameter_recurrence
384     (K := K) hN (n := 3) (by omega) r
385   norm_num [Finset.sum_range_succ, Finset.sum_Ico_eq_sub,
386     reciprocalCoeff_one hN] at h
387   rw [Nat.mul_comm N 3, Nat.mul_comm N 2] at h
388   linear_combination h
389 
390 end ExactParameterRecurrence
391 
392 section PolynomialFactor
393 
394 /-- The universal reciprocal coefficient obtained by taking the parameter to
395 be the indeterminate `X` over `ℚ`.  This is a literal polynomial lift of
396 `P_(N,n)(r)`, not merely a function-valued surrogate. -/
397 def reciprocalCoeffPolynomial (N n : ℕ) : Polynomial ℚ :=
398   reciprocalCoeff (R := Polynomial ℚ) N n Polynomial.X
399 
400 /-- Corollary 7.8 in the universal polynomial ring: every positive-index
401 reciprocal coefficient has the factor `X`. -/
402 theorem X_dvd_reciprocalCoeffPolynomial
403     (N : ℕ) {n : ℕ} (hn : 0 < n) :
404     Polynomial.X ∣ reciprocalCoeffPolynomial N n := by
405   have hpred : n - 1 + 1 = n := Nat.sub_add_cancel (Nat.one_le_iff_ne_zero.mpr hn.ne')
406   have hnewton := reciprocalOrdCoeff_newton
407     (R := Polynomial ℚ) N Polynomial.X (n - 1)
408   have hcast : (((n - 1 : ℕ) : Polynomial ℚ) + 1) =
409       (n : Polynomial ℚ) := by
410     have hc := congrArg (fun m : ℕ => (m : Polynomial ℚ)) hpred
411     simpa only [Nat.cast_add, Nat.cast_one] using hc
412   rw [hpred, hcast] at hnewton
413   have hdivScaled :
414       Polynomial.X ∣ (n : Polynomial ℚ) *
415         reciprocalOrdCoeff N n Polynomial.X := by
416     rw [hnewton]
417     exact dvd_mul_right Polynomial.X _
418   have hnq : (n : ℚ) ≠ 0 := by exact_mod_cast hn.ne'
419   have huq : IsUnit (n : ℚ) := isUnit_iff_ne_zero.mpr hnq
420   have hu : IsUnit (n : Polynomial ℚ) := by
421     change IsUnit (Polynomial.C (n : ℚ))
422     exact huq.map Polynomial.C
423   have hcoeff :
424       Polynomial.X ∣ reciprocalOrdCoeff N n Polynomial.X :=
425     hu.dvd_mul_left.mp hdivScaled
426   rw [reciprocalCoeffPolynomial, reciprocalCoeff, blockCoeff]
427   exact dvd_mul_of_dvd_right hcoeff _
428 
429 /-- Equivalent root-at-zero certificate for the universal polynomial. -/
430 theorem coeff_zero_reciprocalCoeffPolynomial
431     (N : ℕ) {n : ℕ} (hn : 0 < n) :
432     (reciprocalCoeffPolynomial N n).coeff 0 = 0 := by
433   exact Polynomial.X_dvd_iff.mp
434     (X_dvd_reciprocalCoeffPolynomial N hn)
435 
436 end PolynomialFactor
437 
438 section TransferTangent
439 
440 variable {R : Type*} [CommRing R] [Algebra ℚ R]
441 
442 /-- The manuscript's factorially normalized `z`-variable tangent
443 coefficient `T_N(n)`. -/
444 def transferTangentCoeff (N n : ℕ) : R :=
445   (N : R) * ((N * n + N - 1).factorial : R) * kappaCoeff N (n + 1)
446 
447 /-- Exact named form of Proposition 8.2. -/
448 theorem transferTangentCoeff_eq_kappa (N n : ℕ) :
449     transferTangentCoeff (R := R) N n =
450       (N : R) * ((N * n + N - 1).factorial : R) * kappaCoeff N (n + 1) := by
451   rfl
452 
453 section Field
454 
455 variable {K : Type*} [Field K] [CharZero K]
456 
457 private theorem scaled_tangent_convolution_term
458     {N n k : ℕ} (hN : 0 < N) (hk : k ≤ n) :
459     ((N : K) * ((N * n + N - 1).factorial : K)) *
460         (PowerSeries.coeff k (reducedDenominator (R := K) N) *
461           kappaCoeff N (n - k + 1)) =
462       (-1 : K) ^ k *
463         ((N * n + N - 1).choose (N * k) : K) *
464           transferTangentCoeff N (n - k) := by
465   have hmul : N * k ≤ N * n := Nat.mul_le_mul_left N hk
466   have hchoose : N * k ≤ N * n + N - 1 := by omega
467   have hsub :
468       N * n + N - 1 - N * k = N * (n - k) + N - 1 := by
469     rw [Nat.mul_sub_left_distrib]
470     omega
471   have hfacK : ((N * k).factorial : K) ≠ 0 := by
472     exact_mod_cast (N * k).factorial_pos.ne'
473   have hfacRest : ((N * (n - k) + N - 1).factorial : K) ≠ 0 := by
474     exact_mod_cast (N * (n - k) + N - 1).factorial_pos.ne'
475   rw [coeff_reducedDenominator, eq_ratCast]
476   push_cast
477   have hsign : ((↑((-1 : ℚ) ^ k) : K)) = (-1 : K) ^ k := by norm_cast
478   rw [hsign, Nat.cast_choose K hchoose, hsub]
479   rw [transferTangentCoeff]
480   field_simp [hfacK, hfacRest]
481 
482 private theorem scaled_tangent_convolution_rhs
483     (N n : ℕ) (hN : 0 < N) :
484     ((N : K) * ((N * n + N - 1).factorial : K)) *
485         (-(PowerSeries.coeff (n + 1) (reducedDenominator (R := K) N) *
486           (n + 1 : K))) = (-1 : K) ^ n := by
487   have hpos : 0 < N * (n + 1) := Nat.mul_pos hN (Nat.succ_pos n)
488   have htop : N * n + N - 1 = N * (n + 1) - 1 := by
489     rw [Nat.mul_add, Nat.mul_one]
490   have hfac :
491       ((N * (n + 1)).factorial : K) =
492         (N * (n + 1) : K) * ((N * (n + 1) - 1).factorial : K) := by
493     exact_mod_cast (Nat.mul_factorial_pred hpos.ne').symm
494   have hfacTop : ((N * (n + 1) - 1).factorial : K) ≠ 0 := by
495     exact_mod_cast (N * (n + 1) - 1).factorial_pos.ne'
496   have hN0 : (N : K) ≠ 0 := by exact_mod_cast hN.ne'
497   have hn0 : (n + 1 : K) ≠ 0 := by
498     exact_mod_cast (Nat.succ_ne_zero n)
499   rw [coeff_reducedDenominator, eq_ratCast]
500   push_cast
501   have hsign : ((↑((-1 : ℚ) ^ (n + 1)) : K)) =
502       (-1 : K) ^ (n + 1) := by norm_cast
503   rw [hsign, htop, hfac]
504   field_simp [hfacTop, hN0, hn0]
505   rw [pow_succ]
506   ring
507 
508 /-- Fully normalized convolution equation for the named `z`-variable tangent
509 coefficients. -/
510 theorem transferTangentCoeff_convolution
511     (N n : ℕ) (hN : 0 < N) :
512     (∑ k ∈ Finset.range (n + 1),
513         (-1 : K) ^ k *
514           ((N * n + N - 1).choose (N * k) : K) *
515             transferTangentCoeff N (n - k)) = (-1 : K) ^ n := by
516   have hraw := reducedTangent_coefficient_convolution (R := K) N n
517   rw [Finset.Nat.sum_antidiagonal_eq_sum_range_succ_mk] at hraw
518   let scale : K := (N : K) * ((N * n + N - 1).factorial : K)
519   have hscaled := congrArg (fun x : K => scale * x) hraw
520   have hleft :
521       scale *
522           (∑ k ∈ Finset.range (n + 1),
523             PowerSeries.coeff k (reducedDenominator (R := K) N) *
524               kappaCoeff N (n - k + 1)) =
525         ∑ k ∈ Finset.range (n + 1),
526           (-1 : K) ^ k *
527             ((N * n + N - 1).choose (N * k) : K) *
528               transferTangentCoeff N (n - k) := by
529     rw [Finset.mul_sum]
530     apply Finset.sum_congr rfl
531     intro k hk
532     exact scaled_tangent_convolution_term
533       (K := K) hN (Nat.le_of_lt_succ (Finset.mem_range.mp hk))
534   rw [hleft, scaled_tangent_convolution_rhs (K := K) N n hN] at hscaled
535   exact hscaled
536 
537 /-- The exact tangent recurrence of Theorem 8.3. -/
538 theorem transferTangentCoeff_recurrence
539     (N n : ℕ) (hN : 0 < N) :
540     transferTangentCoeff (R := K) N n =
541       (-1 : K) ^ n -
542         ∑ k ∈ Finset.Ico 1 (n + 1),
543           (-1 : K) ^ k *
544             ((N * n + N - 1).choose (N * k) : K) *
545               transferTangentCoeff N (n - k) := by
546   let f : ℕ → K := fun k =>
547     (-1 : K) ^ k *
548       ((N * n + N - 1).choose (N * k) : K) *
549         transferTangentCoeff N (n - k)
550   have hsplit :
551       (∑ k ∈ Finset.range (n + 1), f k) =
552         transferTangentCoeff N n + ∑ k ∈ Finset.Ico 1 (n + 1), f k := by
553     have hi := Finset.sum_Ico_eq_sub f (show 1 ≤ n + 1 by omega)
554     simp only [Finset.sum_range_one] at hi
555     have hf0 : f 0 = transferTangentCoeff N n := by simp [f]
556     rw [hi, hf0]
557     ring
558   have h := transferTangentCoeff_convolution (K := K) N n hN
559   change (∑ k ∈ Finset.range (n + 1), f k) = (-1 : K) ^ n at h
560   rw [hsplit] at h
561   change transferTangentCoeff N n =
562       (-1 : K) ^ n - ∑ k ∈ Finset.Ico 1 (n + 1), f k
563   linear_combination h
564 
565 @[simp]
566 theorem transferTangentCoeff_zero (N : ℕ) (hN : 0 < N) :
567     transferTangentCoeff (R := K) N 0 = 1 := by
568   simpa using transferTangentCoeff_recurrence (K := K) N 0 hN
569 
570 end Field
571 
572 end TransferTangent
573 
574 section FormalRiccati
575 
576 variable {K : Type*} [Field K] [CharZero K]
577 
578 /-- Formal transfer tangent `-D_N'/D_N` in the full `z` variable. -/
579 def formalTransferTangent (N : ℕ) : K⟦X⟧ :=
580   -PowerSeries.derivative K (signedSection (R := K) N 0) *
581     (signedSection (R := K) N 0)⁻¹
582 
583 /-- The complete differential Bell polynomial evaluated at the successive
584 derivatives of a single logarithmic derivative.  Recursively,
585 `Y_0 = 1` and `Y_(n+1) = Y_n' + g Y_n`. -/
586 def differentialBellSeries (g : K⟦X⟧) : ℕ → K⟦X⟧
587   | 0 => 1
588   | n + 1 =>
589       PowerSeries.derivative K (differentialBellSeries g n) +
590         g * differentialBellSeries g n
591 
592 omit [CharZero K] in
593 @[simp]
594 theorem differentialBellSeries_zero (g : K⟦X⟧) :
595     differentialBellSeries g 0 = 1 := rfl
596 
597 omit [CharZero K] in
598 @[simp]
599 theorem differentialBellSeries_succ (g : K⟦X⟧) (n : ℕ) :
600     differentialBellSeries g (n + 1) =
601       PowerSeries.derivative K (differentialBellSeries g n) +
602         g * differentialBellSeries g n := rfl
603 
604 omit [CharZero K] in
605 /-- Recursive differential Bell polynomials encode every iterated derivative
606 of a formal series satisfying `f' = g f`. -/
607 theorem iterate_derivative_eq_differentialBellSeries_mul
608     (f g : K⟦X⟧)
609     (hfg : PowerSeries.derivative K f = g * f) (n : ℕ) :
610     (PowerSeries.derivative K)^[n] f = differentialBellSeries g n * f := by
611   induction n with
612   | zero => simp
613   | succ n ih =>
614       rw [Function.iterate_succ_apply', ih, Derivation.leibniz, hfg]
615       simp only [smul_eq_mul]
616       rw [differentialBellSeries_succ]
617       ring
618 
619 /-- The formal tangent is exactly the negative logarithmic derivative: this
620 version avoids any analytic choice of logarithm. -/
621 theorem derivative_signedSection_zero_eq_neg_formalTransferTangent_mul
622     {N : ℕ} (hN : 0 < N) :
623     PowerSeries.derivative K (signedSection (R := K) N 0) =
624       -formalTransferTangent N * signedSection (R := K) N 0 := by
625   have hconst :
626       PowerSeries.constantCoeff (signedSection (R := K) N 0) = 1 := by
627     simpa using
628       (constantCoeff_iterate_derivative_signedSection
629         (R := K) (j := 0) (k := 0) hN hN)
630   have hunit :
631       PowerSeries.constantCoeff (signedSection (R := K) N 0) ≠ 0 := by
632     simp [hconst]
633   rw [formalTransferTangent]
634   simp only [neg_mul, neg_neg]
635   rw [mul_assoc, PowerSeries.inv_mul_cancel _ hunit, mul_one]
636 
637 /-- Formal scalar higher Riccati identity (Theorem 8.5).  It is the exact
638 power-series analogue of
639 `Y_N(-T,-T',..., -T^(N-1)) = -1`. -/
640 theorem differentialBellSeries_neg_formalTransferTangent_eq_neg_one
641     {N : ℕ} (hN : 0 < N) :
642     differentialBellSeries (-formalTransferTangent (K := K) N) N = -1 := by
643   let D : K⟦X⟧ := signedSection (R := K) N 0
644   have hconst : D.constantCoeff = 1 := by
645     simpa [D] using
646       (constantCoeff_iterate_derivative_signedSection
647         (R := K) (j := 0) (k := 0) hN hN)
648   have hD : D ≠ 0 := by
649     intro hzero
650     rw [hzero, map_zero] at hconst
651     exact zero_ne_one hconst
652   have hbell := iterate_derivative_eq_differentialBellSeries_mul
653     D (-formalTransferTangent (K := K) N)
654       (by
655         simpa [D] using
656           (derivative_signedSection_zero_eq_neg_formalTransferTangent_mul
657             (K := K) hN)) N
658   have hcycle := iterate_derivative_signedSection (R := K) (j := 0) hN
659   rw [show D = signedSection (R := K) N 0 by rfl, hcycle] at hbell
660   apply mul_right_cancel₀ hD
661   simpa [D, mul_assoc] using hbell.symm
662 
663 end FormalRiccati
664 
665 end
666 
667 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: 01f43aa0c5f46c4a4993403416d70d5553486be7ee93076aad64ac01053e8be9

Original source on GitHub

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