← Session 21 — Tier ii′ planning + launch: close SfBoundProp in Lean (D-064)
thinking (3892 chars)
`Finset.sum_range_reflect (f) (n) : (∑ j ∈ range n, f (n - 1 - j)) = ∑ j ∈ range n, f j` — so ← gives the reflection.
For the Icc→range conversion: `Finset.sum_Icc_eq_sum_range` doesn't exist. Options: `Finset.sum_Ico_eq_sum_range`? Let me just do the reindexing via `Finset.sum_bij` or simpler: Icc 1 n = Ioc 0 n, and there's `Finset.sum_Ioc_eq_sum_range`? Alternatively note Icc 1 n = (range (n+1)).erase 0 with `Finset.sum_range_succ_comm`? Hmm.
Cleanest robust approach: avoid the Icc entirely — change the theorem statement to sum over `Finset.range n` with j ↦ j+1? NO — the target form `∑ j ∈ Finset.Icc 1 n` matches D-064's Σ_{j=1}^n — keep the statement. For the reindexing use `Finset.sum_bij`:
```
apply Finset.sum_bij (fun i _ => n - i) (fun i hi => ...) ...
```
That's verbose. Alternative: `Finset.sum_Ico_reflect`? — there was `prod_Ico_reflect` in the imports — `Finset.sum_Ico_reflect (f) (h : a ≤ b) : ∑ i ∈ Ico a b, f (a + b - i) = ∑ i ∈ Ico a b, f i`? Hmm.
Simplest reliable: prove the reindexing equality directly via sum_range_reflect + sum_Icc_eq_sum_range-by-hand:
∑ j ∈ Icc 1 n, g j = ∑ i ∈ range n, g (i + 1):
```
have hIcc : Finset.Icc 1 n = (Finset.range (n + 1)).erase 0 := by
ext j
simp [Finset.mem_Icc, Finset.mem_range, Finset.mem_erase]
omega
rw [hIcc, Finset.sum_erase]
-- ∑ j ∈ range (n+1), g j − g 0 = ∑ i ∈ range n, g(i) + g n − g 0 ... messy
```
Hmm. Alternative cleanest: `Finset.sum_Icc_eq_sum_range` might exist under `Finset.sum_Icc_eq_sum_range` in a different file... it didn't grep. There's `Finset.sum_Ico_eq_sum_range`? Let me check via grep for "Ico.*range" sum lemmas... Actually there's `Finset.sum_range_succ_sub_sum`...
New approach — skip the reindexing gymnastics: prove the sum equality by `Finset.sum_bij` with the explicit bijection i ↦ n−i from range n to Icc 1 n:
```
apply Finset.sum_bij (fun i _ => n - i)
· intro i hi
rw [Finset.mem_range] at hi
simp [Finset.mem_Icc]
omega
· intro i hi
simp
· intro a b ha hb hab
rw [Finset.mem_range] at ha hb
omega
· intro j hj
rw [Finset.mem_Icc] at hj
use n - j
rw [Finset.mem_range]
constructor
· omega
· omega
```
Finset.sum_bij signature: `Finset.sum_bij (i : ∀ a ∈ s, ι) (hi : ∀ a ha, i a ha ∈ t) (h : ∀ a ha, f a = g (i a ha)) (i_inj : InjOn i s) (i_surj : ∀ b ∈ t, ∃ a ha, i a ha = b) : ∑ x ∈ s, f x = ∑ x ∈ t, g x` — the argument order varies by Mathlib version: `sum_bij (i) (hi) (h) (i_inj) (i_surj)`. Let me write:
```
apply Finset.sum_bij (fun i _ => n - i)
· intro i hi
rw [Finset.mem_range] at hi
rw [Finset.mem_Icc]
omega
· intro i hi
rw [Finset.mem_range] at hi
have e1 : n - (n - i) = i := by omega
have e2 : n.choose (n - i) = n.choose i := Nat.choose_symm (by omega)
rw [e1, e2]
· intro a b ha hb hab
rw [Finset.mem_range] at ha hb
omega
· intro j hj
rw [Finset.mem_Icc] at hj
exact ⟨n - j, by rw [Finset.mem_range]; omega, by omega⟩
```
Wait — sum_bij's third argument `h : ∀ a ha, f a = g (i a ha)`: f i = (choose i)·lcoeff(n−i−1), g (i) = (choose i)·lcoeff(i−1), i a ha = n − a: g (n−a) = (choose (n−a))·lcoeff((n−a)−1). Need: (choose a)·lcoeff(n−a−1) = (choose (n−a))·lcoeff(n−a−1) ⟸ choose a = choose (n−a) (Nat.choose_symm: n.choose (n − a) = n.choose a for a ≤ n ✓ direction: n.choose (n−a) = n.choose a — choose_symm gives exactly this ✓). So:
```
· intro i hi
rw [Finset.mem_range] at hi
have e2 : n.choose (n - i) = n.choose i := Nat.choose_symm (by omega)
rw [e2]
```
After rw [e2] both sides: (choose i)·lcoeff(n−i−1) = (choose i)·lcoeff(n−i−1) — wait the RHS: g (n−i) = (n.choose (n−i))·lcoeff((n−i)−1) — after rw [e2]: (n.choose i)·lcoeff(n−i−1) — matches f i exactly ✓ rfl by rw.
Let me replace hre's body with the sum_bij approach. Also fix hterm's field_simp and h2's norm_add_le.
Applying fixes: the norm calc, field_simp with nonzero facts, and a `sum_bij` reindexing.
tool: Bash
input
{
"command": "cd /d/Python/Quantum/research/lean/NguyenRH1 && python - << 'PYEOF'\np = 'NguyenRH1/LiResidue.lean'\ns = open(p, encoding='utf-8').read()\n\n# 1. h2 norm calc fix\ns = s.replace(\"\"\" have h2 : \u2016(z - 1) * riemannZeta z\u2016 \u2264 \u2016(z - 1) * riemannZeta z - 1\u2016 + \u2016(1 : \u2102)\u2016 := by\n have h3 : (z - 1) * riemannZeta z = ((z - 1) * riemannZeta z - 1) + 1 := by ring\n rw [h3]\n exact norm_add_le _ _\"\"\",\n\"\"\" have h2 : \u2016(z - 1) * riemannZeta z\u2016 \u2264 \u2016(z - 1) * riemannZeta z - 1\u2016 + \u2016(1 : \u2102)\u2016 := by\n have h3 : (z - 1) * riemannZeta z = ((z - 1) * riemannZeta z - 1) + 1 := by ring\n calc \u2016(z - 1) * riemannZeta z\u2016 = \u2016((z - 1) * riemannZeta z - 1) + 1\u2016 := by rw [h3]\n _ \u2264 \u2016(z - 1) * riemannZeta z - 1\u2016 + \u2016(1 : \u2102)\u2016 := norm_add_le _ _\"\"\")\n\n# 2. hterm field_simp with ne facts\ns = s.replace(\"\"\" rw [hlc]\n field_simp\n ring\"\"\",\n\"\"\" rw [hlc]\n have hf1 : (n ! : \u2102) \u2260 0 := by simp [Nat.factorial_ne_zero]\n have hf2 : ((n - i) ! : \u2102) \u2260 0 := by simp [Nat.factorial_ne_zero]\n field_simp [hf1, hf2]\n ring\"\"\")\n\n# 3. hre via sum_bij\nold_hre = s[s.index(\" have hre : (\u2211 i \u2208 Finset.range n, (n.choose i : \u2102) * lcoeff (n - i - 1)) =\"):]\nold_hre = old_hre[:old_hre.index(\" exact hre\") + len(\" exact hre\")]\nnew_hre = \"\"\" have hre : (\u2211 i \u2208 Finset.range n, (n.choose i : \u2102) * lcoeff (n - i - 1)) =\n \u2211 j \u2208 Finset.Icc 1 n, (n.choose j : \u2102) * lcoeff (j - 1) := by\n apply Finset.sum_bij (fun i _ => n - i)\n \u00b7 intro i hi\n rw [Finset.mem_range] at hi\n rw [Finset.mem_Icc]\n omega\n \u00b7 intro i hi\n rw [Finset.mem_range] at hi\n have e2 : n.choose (n - i) = n.choose i := Nat.choose_symm (by omega)\n rw [e2]\n \u00b7 intro a b ha hb hab\n rw [Finset.mem_range] at ha hb\n omega\n \u00b7 intro j hj\n rw [Finset.mem_Icc] at hj\n exact \u27e8n - j, by rw [Finset.mem_range]; omega, by omega\u27e9\n exact hre\"\"\"\ns = s.replace(old_hre, new_hre)\n\nopen(p, 'w', encoding='utf-8').write(s)\nprint(\"patched\")\nPYEOF\nexport PATH=\"$HOME/.elan/bin:$PATH\" && lake env lean NguyenRH1/LiResidue.lean 2>&1 | head -40",
"description": "Apply sixth round of fixes and recompile",
"timeout": 420000
}
raw content_json (database row)
[{"type":"thinking","thinking":"`Finset.sum_range_reflect (f) (n) : (∑ j ∈ range n, f (n - 1 - j)) = ∑ j ∈ range n, f j` — so ← gives the reflection. \n\nFor the Icc→range conversion: `Finset.sum_Icc_eq_sum_range` doesn't exist. Options: `Finset.sum_Ico_eq_sum_range`? Let me just do the reindexing via `Finset.sum_bij` or simpler: Icc 1 n = Ioc 0 n, and there's `Finset.sum_Ioc_eq_sum_range`? Alternatively note Icc 1 n = (range (n+1)).erase 0 with `Finset.sum_range_succ_comm`? Hmm. \n\nCleanest robust approach: avoid the Icc entirely — change the theorem statement to sum over `Finset.range n` with j ↦ j+1? NO — the target form `∑ j ∈ Finset.Icc 1 n` matches D-064's Σ_{j=1}^n — keep the statement. For the reindexing use `Finset.sum_bij`:\n```\n apply Finset.sum_bij (fun i _ => n - i) (fun i hi => ...) ...\n```\nThat's verbose. Alternative: `Finset.sum_Ico_reflect`? — there was `prod_Ico_reflect` in the imports — `Finset.sum_Ico_reflect (f) (h : a ≤ b) : ∑ i ∈ Ico a b, f (a + b - i) = ∑ i ∈ Ico a b, f i`? Hmm.\n\nSimplest reliable: prove the reindexing equality directly via sum_range_reflect + sum_Icc_eq_sum_range-by-hand:\n∑ j ∈ Icc 1 n, g j = ∑ i ∈ range n, g (i + 1): \n```\nhave hIcc : Finset.Icc 1 n = (Finset.range (n + 1)).erase 0 := by\n ext j\n simp [Finset.mem_Icc, Finset.mem_range, Finset.mem_erase]\n omega\nrw [hIcc, Finset.sum_erase]\n-- ∑ j ∈ range (n+1), g j − g 0 = ∑ i ∈ range n, g(i) + g n − g 0 ... messy\n```\nHmm. Alternative cleanest: `Finset.sum_Icc_eq_sum_range` might exist under `Finset.sum_Icc_eq_sum_range` in a different file... it didn't grep. There's `Finset.sum_Ico_eq_sum_range`? Let me check via grep for \"Ico.*range\" sum lemmas... Actually there's `Finset.sum_range_succ_sub_sum`... \n\nNew approach — skip the reindexing gymnastics: prove the sum equality by `Finset.sum_bij` with the explicit bijection i ↦ n−i from range n to Icc 1 n:\n```\n apply Finset.sum_bij (fun i _ => n - i)\n · intro i hi\n rw [Finset.mem_range] at hi\n simp [Finset.mem_Icc]\n omega\n · intro i hi\n simp\n · intro a b ha hb hab\n rw [Finset.mem_range] at ha hb\n omega\n · intro j hj\n rw [Finset.mem_Icc] at hj\n use n - j\n rw [Finset.mem_range]\n constructor\n · omega\n · omega\n```\nFinset.sum_bij signature: `Finset.sum_bij (i : ∀ a ∈ s, ι) (hi : ∀ a ha, i a ha ∈ t) (h : ∀ a ha, f a = g (i a ha)) (i_inj : InjOn i s) (i_surj : ∀ b ∈ t, ∃ a ha, i a ha = b) : ∑ x ∈ s, f x = ∑ x ∈ t, g x` — the argument order varies by Mathlib version: `sum_bij (i) (hi) (h) (i_inj) (i_surj)`. Let me write:\n```\n apply Finset.sum_bij (fun i _ => n - i)\n · intro i hi\n rw [Finset.mem_range] at hi\n rw [Finset.mem_Icc]\n omega\n · intro i hi\n rw [Finset.mem_range] at hi\n have e1 : n - (n - i) = i := by omega\n have e2 : n.choose (n - i) = n.choose i := Nat.choose_symm (by omega)\n rw [e1, e2]\n · intro a b ha hb hab\n rw [Finset.mem_range] at ha hb\n omega\n · intro j hj\n rw [Finset.mem_Icc] at hj\n exact ⟨n - j, by rw [Finset.mem_range]; omega, by omega⟩\n```\nWait — sum_bij's third argument `h : ∀ a ha, f a = g (i a ha)`: f i = (choose i)·lcoeff(n−i−1), g (i) = (choose i)·lcoeff(i−1), i a ha = n − a: g (n−a) = (choose (n−a))·lcoeff((n−a)−1). Need: (choose a)·lcoeff(n−a−1) = (choose (n−a))·lcoeff(n−a−1) ⟸ choose a = choose (n−a) (Nat.choose_symm: n.choose (n − a) = n.choose a for a ≤ n ✓ direction: n.choose (n−a) = n.choose a — choose_symm gives exactly this ✓). So:\n```\n · intro i hi\n rw [Finset.mem_range] at hi\n have e2 : n.choose (n - i) = n.choose i := Nat.choose_symm (by omega)\n rw [e2]\n```\nAfter rw [e2] both sides: (choose i)·lcoeff(n−i−1) = (choose i)·lcoeff(n−i−1) — wait the RHS: g (n−i) = (n.choose (n−i))·lcoeff((n−i)−1) — after rw [e2]: (n.choose i)·lcoeff(n−i−1) — matches f i exactly ✓ rfl by rw.\n\nLet me replace hre's body with the sum_bij approach. Also fix hterm's field_simp and h2's norm_add_le.","signature":""},{"type":"text","text":"Applying fixes: the norm calc, field_simp with nonzero facts, and a `sum_bij` reindexing."},{"type":"tool_use","id":"Bash_209","name":"Bash","input":{"command":"cd /d/Python/Quantum/research/lean/NguyenRH1 && python - << 'PYEOF'\np = 'NguyenRH1/LiResidue.lean'\ns = open(p, encoding='utf-8').read()\n\n# 1. h2 norm calc fix\ns = s.replace(\"\"\" have h2 : ‖(z - 1) * riemannZeta z‖ ≤ ‖(z - 1) * riemannZeta z - 1‖ + ‖(1 : ℂ)‖ := by\n have h3 : (z - 1) * riemannZeta z = ((z - 1) * riemannZeta z - 1) + 1 := by ring\n rw [h3]\n exact norm_add_le _ _\"\"\",\n\"\"\" have h2 : ‖(z - 1) * riemannZeta z‖ ≤ ‖(z - 1) * riemannZeta z - 1‖ + ‖(1 : ℂ)‖ := by\n have h3 : (z - 1) * riemannZeta z = ((z - 1) * riemannZeta z - 1) + 1 := by ring\n calc ‖(z - 1) * riemannZeta z‖ = ‖((z - 1) * riemannZeta z - 1) + 1‖ := by rw [h3]\n _ ≤ ‖(z - 1) * riemannZeta z - 1‖ + ‖(1 : ℂ)‖ := norm_add_le _ _\"\"\")\n\n# 2. hterm field_simp with ne facts\ns = s.replace(\"\"\" rw [hlc]\n field_simp\n ring\"\"\",\n\"\"\" rw [hlc]\n have hf1 : (n ! : ℂ) ≠ 0 := by simp [Nat.factorial_ne_zero]\n have hf2 : ((n - i) ! : ℂ) ≠ 0 := by simp [Nat.factorial_ne_zero]\n field_simp [hf1, hf2]\n ring\"\"\")\n\n# 3. hre via sum_bij\nold_hre = s[s.index(\" have hre : (∑ i ∈ Finset.range n, (n.choose i : ℂ) * lcoeff (n - i - 1)) =\"):]\nold_hre = old_hre[:old_hre.index(\" exact hre\") + len(\" exact hre\")]\nnew_hre = \"\"\" have hre : (∑ i ∈ Finset.range n, (n.choose i : ℂ) * lcoeff (n - i - 1)) =\n ∑ j ∈ Finset.Icc 1 n, (n.choose j : ℂ) * lcoeff (j - 1) := by\n apply Finset.sum_bij (fun i _ => n - i)\n · intro i hi\n rw [Finset.mem_range] at hi\n rw [Finset.mem_Icc]\n omega\n · intro i hi\n rw [Finset.mem_range] at hi\n have e2 : n.choose (n - i) = n.choose i := Nat.choose_symm (by omega)\n rw [e2]\n · intro a b ha hb hab\n rw [Finset.mem_range] at ha hb\n omega\n · intro j hj\n rw [Finset.mem_Icc] at hj\n exact ⟨n - j, by rw [Finset.mem_range]; omega, by omega⟩\n exact hre\"\"\"\ns = s.replace(old_hre, new_hre)\n\nopen(p, 'w', encoding='utf-8').write(s)\nprint(\"patched\")\nPYEOF\nexport PATH=\"$HOME/.elan/bin:$PATH\" && lake env lean NguyenRH1/LiResidue.lean 2>&1 | head -40","description":"Apply sixth round of fixes and recompile","timeout":420000},"extra_content":null}]