Paper IX · Lean source
NewtonDominance.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.
strengthening/formalization/NewtonDominance.lean152 lines
Original source path
preserved/PRSC_IX_Consolidated_Manuscript/strengthening/formalization/NewtonDominance.leanSkip declarations and read code
1 module
2
3 public import GlobalEulerBoundary
4 public import Mathlib.NumberTheory.Padics.PadicVal.Basic
5
6 @[expose] public section
7 noncomputable section
8 set_option autoImplicit false
9
10 namespace KomorebiPaperIX.NewtonDominance
11
12 open Mahler GlobalEulerBoundary
13
14 lemma precision_mono {L M : ℤ} {x : ℚ} (h : L ≤ M)
15 (hx : precision 2 M x) : precision 2 L x := by
16 rcases hx with hx | hx
17 · exact Or.inl hx
18 · exact Or.inr (h.trans hx)
19
20 lemma precision_add {L : ℤ} {x y : ℚ}
21 (hx : precision 2 L x) (hy : precision 2 L y) : precision 2 L (x + y) := by
22 rcases hx with rfl | hx
23 · simpa using hy
24 rcases hy with rfl | hy
25 · rw [add_zero]
26 exact Or.inr hx
27 by_cases h : x + y = 0
28 · exact Or.inl h
29 · exact Or.inr ((le_min hx hy).trans (padicValRat.min_le_padicValRat_add h))
30
31 lemma precision_sum {ι : Type*} (S : Finset ι) (g : ι → ℚ) (L : ℤ)
32 (H : ∀ i ∈ S, precision 2 L (g i)) : precision 2 L (∑ i ∈ S, g i) := by
33 classical
34 induction S using Finset.induction_on with
35 | empty => simp
36 | @insert i S hi ih =>
37 rw [Finset.sum_insert hi]
38 exact precision_add (H i (Finset.mem_insert_self _ _))
39 (ih (by intro j hj; exact H j (Finset.mem_insert_of_mem hj)))
40
41 lemma precision_mul {L M : ℤ} {x y : ℚ}
42 (hx : precision 2 L x) (hy : precision 2 M y) : precision 2 (L + M) (x * y) := by
43 by_cases hxn : x = 0
44 · simp [hxn]
45 by_cases hyn : y = 0
46 · simp [hyn]
47 have hxv := hx.resolve_left hxn
48 have hyv := hy.resolve_left hyn
49 exact Or.inr (by rw [padicValRat.mul hxn hyn]; omega)
50
51 lemma precision_mul_nat {L : ℤ} {x : ℚ} (hx : precision 2 L x) (b : ℕ) :
52 precision 2 L (x * (b : ℚ)) := by
53 simpa using precision_mul hx (Or.inr (zero_le_padicValRat_of_nat b) : precision 2 0 (b : ℚ))
54
55 /-- A strictly higher precision perturbation cannot cancel the leading term. -/
56 lemma strict_dominance (x y : ℚ) (c : ℤ) (hx : x ≠ 0)
57 (hv : padicValRat 2 x = c) (hy : precision 2 (c + 1) y) :
58 x + y ≠ 0 ∧ padicValRat 2 (x + y) = c := by
59 rcases hy with rfl | hy
60 · simpa using And.intro hx hv
61 have hsum : x + y ≠ 0 := by
62 intro h
63 have heq : y = -x := by linarith
64 rw [heq, padicValRat.neg, hv] at hy
65 omega
66 by_cases hyn : y = 0
67 · simp [hyn, hx, hv]
68 exact ⟨hsum, (padicValRat.add_eq_of_lt hsum hx hyn (by omega)).trans hv⟩
69
70 /-- Translation preserves a monotone lower envelope on the Newton coefficients. -/
71 lemma translated_tail (f : ℕ → ℚ) (c k n : ℕ) (hk : 2 ≤ k)
72 (H : ∀ i, 2 ≤ i → precision 2 ((c + 1 + Nat.log 2 i : ℕ) : ℤ) (coefficient f i)) :
73 precision 2 ((c + 1 + Nat.log 2 k : ℕ) : ℤ) (difference 1 k f n) := by
74 rw [difference_from_coefficients]
75 apply precision_sum
76 intro j _
77 apply precision_mul_nat
78 apply precision_mono _ (H (k + j) (by omega))
79 exact_mod_cast Nat.add_le_add_left (Nat.log_monotone (show k ≤ k + j by omega)) (c + 1)
80
81 lemma first_difference_tail (f : ℕ → ℚ) (c n : ℕ)
82 (H : ∀ i, 2 ≤ i → precision 2 ((c + 1 + Nat.log 2 i : ℕ) : ℤ) (coefficient f i)) :
83 precision 2 ((c : ℤ) + 1) (difference 1 1 f n - coefficient f 1) := by
84 rw [difference_from_coefficients, Finset.sum_range_succ']
85 simp only [Nat.add_zero, Nat.choose_zero_right, Nat.cast_one, mul_one]
86 rw [add_sub_cancel_right]
87 apply precision_sum
88 intro j _
89 apply precision_mul_nat
90 exact precision_mono (by norm_num) (H (1 + (j + 1)) (by omega))
91
92 /-- The standard binomial denominator identity retains the valuation of the displacement. -/
93 lemma choose_precision (T k : ℕ) (hT : 0 < T) (hk : 0 < k) :
94 precision 2 ((padicValNat 2 T : ℤ) - Nat.log 2 k) (T.choose k : ℚ) := by
95 by_cases hzero : T.choose k = 0
96 · simp [hzero]
97 have hkT : k ≤ T := Nat.le_of_not_gt (by intro h; exact hzero (Nat.choose_eq_zero_of_lt h))
98 have hprev : (T - 1).choose (k - 1) ≠ 0 := Nat.ne_of_gt (Nat.choose_pos (by omega))
99 have hid : T * ((T - 1).choose (k - 1)) = T.choose k * k := by
100 simpa only [Nat.sub_add_cancel hT, Nat.sub_add_cancel hk] using
101 Nat.add_one_mul_choose_eq (T - 1) (k - 1)
102 have hv := congrArg (padicValNat 2) hid
103 rw [padicValNat.mul (by omega) hprev, padicValNat.mul hzero (by omega)] at hv
104 have hlog := padicValNat_le_nat_log (p := 2) k
105 apply Or.inr
106 rw [padicValRat.of_nat]
107 omega
108
109 /-- Finite Gregory–Newton expansion, with its first two terms separated. -/
110 lemma displacement_expansion (f : ℕ → ℚ) (n T : ℕ) (hT : 0 < T) :
111 f (n + T) - f n = difference 1 1 f n * (T : ℚ) +
112 ∑ k ∈ Finset.range (T - 1), difference 1 (k + 2) f n * (T.choose (k + 2) : ℚ) := by
113 have hn := shift_eq_sum_fwdDiff_iter 1 f T n
114 simp only [nsmul_eq_mul, Nat.mul_one] at hn
115 change f (n + T) = ∑ k ∈ Finset.range (T + 1), (T.choose k : ℚ) * difference 1 k f n at hn
116 have ht : T + 1 = (T - 1) + 1 + 1 := by omega
117 rw [ht, Finset.sum_range_succ', Finset.sum_range_succ'] at hn
118 simp only [Nat.choose_zero_right, Nat.cast_one, difference_zero, one_mul,
119 Nat.zero_add, Nat.choose_one_right] at hn
120 rw [hn]
121 simp only [Nat.add_assoc, show 1 + 1 = 2 by rfl]
122 rw [show (∑ k ∈ Finset.range (T - 1), (T.choose (k + 2) : ℚ) * difference 1 (k + 2) f n) =
123 ∑ k ∈ Finset.range (T - 1), difference 1 (k + 2) f n * (T.choose (k + 2) : ℚ) by
124 apply Finset.sum_congr rfl; intro k _; ring]
125 ring
126
127 /-- A strict Newton coefficient envelope gives the exact valuation of every displacement. -/
128 theorem exact_displacement (f : ℕ → ℚ) (c : ℕ)
129 (h1 : coefficient f 1 ≠ 0) (hv1 : padicValRat 2 (coefficient f 1) = (c : ℤ))
130 (H : ∀ k, 2 ≤ k → precision 2 ((c + 1 + Nat.log 2 k : ℕ) : ℤ) (coefficient f k))
131 (n T : ℕ) (hT : 0 < T) :
132 f (n + T) - f n ≠ 0 ∧
133 padicValRat 2 (f (n + T) - f n) = (padicValNat 2 T : ℤ) + (c : ℤ) := by
134 have hd := strict_dominance (coefficient f 1)
135 (difference 1 1 f n - coefficient f 1) (c : ℤ) h1 hv1 (first_difference_tail f c n H)
136 rw [add_sub_cancel] at hd
137 have hTq : (T : ℚ) ≠ 0 := by exact_mod_cast (Nat.ne_of_gt hT)
138 have hvlead : padicValRat 2 (difference 1 1 f n * (T : ℚ)) =
139 (padicValNat 2 T : ℤ) + (c : ℤ) := by
140 rw [padicValRat.mul hd.1 hTq, hd.2, padicValRat.of_nat]
141 omega
142 rw [displacement_expansion f n T hT]
143 apply strict_dominance _ _ _ (mul_ne_zero hd.1 hTq) hvlead
144 apply precision_sum
145 intro k _
146 have hmul := precision_mul (translated_tail f c (k + 2) n (by omega) H)
147 (choose_precision T (k + 2) hT (by omega))
148 convert hmul using 1
149 push_cast
150 ring
151
152 end KomorebiPaperIX.NewtonDominance
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: 57973ae0db7d02891a2d2048d5b68530252d47a354cb7569edb4922f7b73da05
Back to Paper IX: Arithmetic Packets, Dyadic Towers, and Local Polynomial Deformation