← Session 31 — ii′-5f: tight R-bound 10.5/48 (piece 3 + pinch)
thinking (12775 chars)
Committed (79c506b). Wait — 2001 insertions and 817 DELETIONS? The deletions are because my Edit rewrote section 9's earlier versions. Fine.
Now piece 3b: the C0hat bridges + conj machinery.
**C0hat bridges** (§13):
1. `C0hat_two_mul_add_one_le (k : ℕ) (hk : 10 ≤ k) : C0hat (2*(k:ℝ)+1) ≤ 0.433 * (Real.log k + 0.833) + 0.886 * (Real.log (Real.log k) + 0.3475) + 2.9`
C0hat(2k+1) = 0.433·log(2k+3) + 0.886·loglog(2k+3) + 2.9.
- log(2k+3) ≤ log k + 0.833: 2k+3 ≤ 2.3k ⟺ 3 ≤ 0.3k ⟺ k ≥ 10 ✓: log(2k+3) ≤ log(2.3k) = log 2.3 + log k ≤ 0.833 + log k (log_two_point_three_le ✓).
- loglog(2k+3) ≤ loglog k + 0.3475: log(2k+3) ≤ log k + 0.833 ⟹ loglog(2k+3) ≤ log(log k + 0.833) ≤ loglog k + 0.833/log k ≤ loglog k + 0.833/log 11 ≤ loglog k + 0.3475 (log 11 ≥ 2.3978: 0.833/2.3978 = 0.34740 ≤ 0.3475 ✓). Need: log(a+c) ≤ log a + c/a (a > 0, c ≥ 0): log(a+c) − log a = log(1+c/a) ≤ c/a (log(1+u) ≤ u ✓ Real.log_le_sub_one_of_pos with 1+u = 1+c/a).
Also need log k ≥ log 11 > 0 for the division: k ≥ 11 ✓ (hk : 10 ≤ k gives k ≥ 10 — the 2k+3 ≤ 2.3k needs k ≥ 10 ✓ and log k ≥ log 10 ≥ 2.3025: 0.833/2.3025 = 0.36177 ≤ 0.3475?? 0.833/2.3025 = 0.36178 > 0.3475!! — hmm: for k = 10: 0.833/log 10 = 0.833/2.302585 = 0.36177 > 0.3475!! So the 0.3475 bound FAILS at k = 10?!!
Wait — for k = 10: C0hat(2·10+1) = C0hat(21) = 0.433·log 23 + 0.886·loglog 23 + 2.9 = 0.433·3.13549+0.886·1.14289+2.9 = 1.35768+1.01260+2.9 = 5.27028. The bound: 0.433·(log 10+0.833)+0.886·(loglog 10+0.3475)+2.9 = 0.433·(2.30259+0.833)+0.886·(0.83403+0.3475)+2.9 = 0.433·3.13559+0.886·1.18153+2.9 = 1.35771+1.04684+2.9 = 5.30455 ≥ 5.27028 ✓ holds! Because the loglog-increment bound: loglog(2k+3) − loglog k ≤ 0.833/log k — at k = 10: loglog 23 − loglog 10 = 1.14289−0.83403 = 0.30886 ≤ 0.3475 ✓ — the TRUE increment is 0.31, and my crude bound 0.833/log k = 0.3618 also exceeds it, but I bounded 0.833/log 10 ≤ 0.3475 which is FALSE (0.3618 > 0.3475). But the FINAL bound still holds because the increment is really ≤ 0.833/log k and then I need 0.833/log k ≤ 0.3475 — FALSE at k = 10. Hmm — but wait: do I need the increment ≤ 0.3475 at k = 10, or can I use the TRUE increment at k = 10? The tail bricks start at k ≥ 11, so the C0hat(2k+1) form is only needed for k ≥ 11!! At k ≥ 11: log k ≥ log 11 ≥ 2.3978, 0.833/2.3978 = 0.34740 ≤ 0.3475 ✓. So state the bridge with (hk : 11 ≤ k). At k = 10, the main range uses C0hat(t+k+1) ≤ C0hat(2t+1) — different lemma. So: `C0hat_two_mul_add_one_le (k : ℕ) (hk : 11 ≤ k)`. ✓
Proof structure:
```
lemma C0hat_two_mul_add_one_le {k : ℕ} (hk : 11 ≤ k) :
C0hat (2 * (k : ℝ) + 1)
≤ 0.433 * (Real.log k + 0.833) + 0.886 * (Real.log (Real.log k) + 0.3475) + 2.9 := by
have hkR : (11 : ℝ) ≤ (k : ℝ) := by exact_mod_cast hk
have hk0 : (0 : ℝ) < (k : ℝ) := by linarith
-- log(2k+3) ≤ log k + 0.833
have h1 : Real.log (2 * (k : ℝ) + 1 + 2) ≤ Real.log k + 0.833 := by
have h2 : (2 : ℝ) * (k : ℝ) + 3 ≤ 2.3 * (k : ℝ) := by linarith [hkR]
have h3 : Real.log (2 * (k : ℝ) + 3) ≤ Real.log (2.3 * (k : ℝ)) :=
Real.log_le_log (by positivity) h2
have h4 : Real.log (2.3 * (k : ℝ)) = Real.log 2.3 + Real.log k :=
Real.log_mul (by norm_num : (2.3 : ℝ) ≠ 0) hk0.ne'
have h5 := log_two_point_three_le
have h6 : 2 * (k : ℝ) + 1 + 2 = 2 * (k : ℝ) + 3 := by ring
rw [h6, h4] at h3
linarith [h3, h5]
-- loglog(2k+3) ≤ loglog k + 0.3475
have h2 : Real.log (Real.log (2 * (k : ℝ) + 1 + 2)) ≤ Real.log (Real.log k) + 0.3475 := by
have hlogk : (2.3978 : ℝ) ≤ Real.log k := by
have h2a := log_eleven_ge
have h2b : Real.log 11 ≤ Real.log k := Real.log_le_log (by norm_num) hkR
linarith [h2a, h2b]
have h3 : Real.log (Real.log (2 * (k : ℝ) + 3)) ≤ Real.log (Real.log k + 0.833) :=
Real.log_le_log (by positivity : (0:ℝ) < Real.log (2*(k:ℝ)+3)) h1
-- log(a+c) ≤ log a + c/a
have h4 : Real.log (Real.log k + 0.833) ≤ Real.log (Real.log k) + 0.833 / Real.log k := by
have ha : (0 : ℝ) < Real.log k := by linarith [hlogk]
have h5 : Real.log (Real.log k + 0.833) = Real.log (Real.log k * (1 + 0.833 / Real.log k)) := by
rw [show Real.log k + 0.833 = Real.log k * (1 + 0.833 / Real.log k) from by
field_simp [ha.ne']
ring]
rw [h5, Real.log_mul ha.ne' (by positivity : (1 : ℝ) + 0.833 / Real.log k ≠ 0)]
have h6 : Real.log (1 + 0.833 / Real.log k) ≤ 0.833 / Real.log k :=
Real.log_le_sub_one_of_pos (by positivity : (0:ℝ) < 1 + 0.833 / Real.log k)
linarith [h6]
have h7 : (0.833 : ℝ) / Real.log k ≤ 0.3475 := by
have ha : (0 : ℝ) < Real.log k := by linarith [hlogk]
rw [div_le_iff₀ ha]
have h8 : (0.3475 : ℝ) * 2.3978 ≤ 0.3475 * Real.log k :=
mul_le_mul_of_nonneg_left hlogk (by norm_num)
have h9 : (0.833 : ℝ) ≤ 0.3475 * 2.3978 := by norm_num
exact h9.trans h8
-- assemble
have h10 : Real.log (2 * (k : ℝ) + 1 + 2) = Real.log (2 * (k : ℝ) + 3) := by
congr 1; ring
rw [h10]
have h11 : Real.log (2 * (k : ℝ) + 3) ≤ Real.log k + 0.833 := h1'
...
-- unfold C0hat and combine
rw [C0hat]
have harg : (2 : ℝ) * (k : ℝ) + 1 + 2 = 2 * (k : ℝ) + 3 := by ring
-- C0hat y = 0.433 log(y+2) + 0.886 loglog(y+2) + 2.9 with y = 2k+1: y+2 = 2k+3
...
```
Need to be careful with the h1/h1' duplication. Let me structure cleanly in the actual code.
2. `C0hat_add_one_le_of_fourteen_le {j : ℕ} (hj : 14 ≤ j) : C0hat ((j:ℝ)+1) ≤ 0.433 * (Real.log j + 0.1942) + 0.886 * (Real.log (Real.log j) + 0.0736) + 2.9`
- log(j+3) ≤ log j + 0.1942: j+3 ≤ (17/14)j ⟺ 3 ≤ (3/14)j ⟺ j ≥ 14 ✓: log(j+3) ≤ log((17/14)j) = log(17/14)+log j ≤ 0.1942+log j (log_17_14_le ✓).
- loglog(j+3) ≤ loglog j + 0.1942/log j ≤ loglog j + 0.1942/log 14 ≤ loglog j + 0.0736 (log 14 ≥ 2.6388: 0.1942/2.6388 = 0.073594 ≤ 0.0736 ✓).
3. `C0hat_two_t_add_one_le {t : ℝ} (ht : 10 ≤ t) : C0hat (2*t+1) ≤ C0hat (t+1) + 0.55`
diff = 0.433·log((2t+3)/(t+3)) + 0.886·[loglog(2t+3)−loglog(t+3)]:
- log((2t+3)/(t+3)) = log(2t+3) − log(t+3) ≤ log 2 ≤ 0.6932 (2t+3 ≤ 2(t+3) ⟹ log(2t+3) ≤ log 2 + log(t+3)).
- loglog(2t+3) − loglog(t+3) ≤ log 2/log(t+3) ≤ 0.6932/log 13 ≤ 0.6932/2.5649 = 0.27027·... hmm need log 13 ≥ 2.5649 — I don't have that lemma (decided unneeded earlier)! 0.6932/log 13 with log 13 ≥ ?: use log 13 ≥ 1: 0.6932/1 = 0.6932 ✗ too big. log 13 ≥ 2: 13 ≥ e² = 7.389 ✓ EASY (e² ≤ 7.3890566 ≤ 13): 0.6932/2 = 0.3466 ✗ too big (need ≤ 0.27027+). log 13 ≥ 2.5: 13 ≥ e^2.5 = 12.1825 ✓ (e^2.5 = e²·e^0.5 ≤ 7.3890566·1.6487 = 12.183 ≤ 13 ✓): 0.6932/2.5 = 0.27728 ✗ (need ≤ 0.2703 — 0.27728 > 0.2703!). Hmm — the budget: diff ≤ 0.433·0.6932+0.886·X ≤ 0.55 ⟺ 0.30016+0.886X ≤ 0.55 ⟺ X ≤ 0.28203. So need loglog-increment ≤ 0.28203: 0.6932/log 13 ≤ 0.28203 ⟺ log 13 ≥ 2.4577: 13 ≥ e^2.4577 = 11.678 ✓ (e^2.4577 = e²·e^0.4577 ≤ 7.3890566·1.5805 = 11.677 ≤ 13 ✓). So: log 13 ≥ 2.4577 via 13 ≥ e^2.4577 (e^0.4577 ≤ 1.5805: partial sums? — need exp UPPER again! e^0.4577 ≤ 1.5805: (1−0.4577/n)^{-n}... e^0.4577 ≤ 1/(1−0.4577) = 1.8443 ✗; e^0.4577 = (e^0.4577/2)² ≤ (1/(1−0.22885))² = 1.2971² = 1.6825 ✗; n=4: 1/(1−0.114425)⁴ = 1.12925⁴ = 1.6268 ✗; n=8: (1−0.0572)^{-8}: 0.94279^8 = 0.62405·... 1/0.62405 = 1.60244 ✗; true e^0.4577 = 1.58040. n=16: (1−0.02860625)^{-16}: (0.97139)^{16} = e^{16·ln 0.97139} = e^{16·(−0.029023)} = e^{−0.46437} = 0.62854: 1/0.62854 = 1.59095 ✗. n=32: ≈1.5857 ✗. Converges to 1.5804 slowly. Hmm.
ALTERNATIVE for the loglog-increment: loglog(2t+3) − loglog(t+3) = log(log(2t+3)/log(t+3)) ≤ (log(2t+3)/log(t+3)) − 1 = (log(2t+3)−log(t+3))/log(t+3) ≤ log 2/log(t+3) ≤ 0.6932/log 13. And log 13: I DO have log_thirteen_le (log 13 ≤ 2.565, upper) but need lower: log 13 ≥ 2.4577-ish. Get log 13 ≥ 2.5 via 13 ≥ e^2.5: e^2.5 ≤ 13 ⟺ ... e^2.5 = e²·√e ≤ 7.3890566·1.6488: need √e ≤ 1.6488 ⟺ e ≤ 1.6488² = 2.71854·... e ≤ 2.7182819 ✓ and 1.6488² = 2.71854 ≥ 2.7182819 ✓!! So e^2.5 = e²·e^0.5 ≤ 7.3890566·1.6488 = 12.18319 ≤ 13 ✓ — provable: e^0.5 ≤ 1.6488 ⟺ e ≤ 1.6488² (Real.le_sqrt route: e^0.5 = √e — Real.exp_half? or via Real.exp 0.5 = Real.sqrt (Real.exp 1)? there's `Real.exp_half : exp (1/2) = sqrt e`? or exp_nat_mul inverse. Hmm: (e^0.5)² = e — e^0.5 ≤ 1.6488 ⟸ (e^0.5)² ≤ 1.6488² ⟸ e ≤ 2.71854 ✓ — with e^0.5 ≥ 0: pow_le_pow_left₀: e^0.5 ≤ 1.6488 ⟸ e ≤ 1.6488²: need the SQ relation: (Real.exp 0.5)^2 = Real.exp 1: rw [← Real.exp_add]: exp 0.5·exp 0.5 = exp(0.5+0.5) = exp 1 ✓. So: h : Real.exp 0.5 * Real.exp 0.5 = Real.exp 1 := by rw [← Real.exp_add]; congr 1; ring. Then e^2.5 = e²·e^0.5: Real.exp 2.5 = exp(2+0.5) = exp 2·exp 0.5: rw [show (2.5:ℝ) = 2+0.5 from by norm_num, Real.exp_add]; exp 2 = (exp 1)² via exp_nat_mul or exp_add. Then bound ≤ 7.3890566·1.6488 ≤ 13 (norm_num).
So: `log_thirteen_ge : (2.5 : ℝ) ≤ Real.log 13` — via 13 ≥ e^2.5 ⟹ log 13 ≥ 2.5 (Real.le_log_iff_exp_le). Then loglog-increment ≤ 0.6932/2.5 = 0.27728 ≤ 0.28203 ✓. Then diff ≤ 0.433·0.6932 + 0.886·0.27728 = 0.30016+0.24567 = 0.54583 ≤ 0.55 ✓ (margin 4.2e-3 — thin but OK).
Actually let me double-check the diff bound is tight enough: TRUE diff at t = 10: C0hat(21)−C0hat(11) = 5.27028−(0.433·log 13+0.886·loglog 13+2.9) = 5.27028−(0.433·2.56495+0.886·0.94086+2.9) = 5.27028−(1.11062+0.83360+2.9) = 5.27028−4.84422 = 0.42606 ≤ 0.55 ✓ (true margin 0.12 — the slack in my bound is the loglog-increment overestimate: true = log(log 23/log 13) = log(1.22238) = 0.20072 vs my 0.27728 — 0.077 slack ✓ fine).
4. Also need: `C0hat_two_le_of...`? No — the main bucket count uses C0hat(t−k) ≤ C0hat(t+1) via C0hat_mono (exists, needs 1 ≤ t−k: for k ≤ t−3: t−k ≥ 3 ≥ 1 ✓; C0hat_mono (1 ≤ a) (a ≤ b) ✓).
**zeroMult_conj machinery** (§14):
- `hasDerivAt_conj_of_conj_eq` (general conj-deriv lemma).
- `iteratedDeriv_riemannZeta_conj (n : ℕ) {z : ℂ} (hz : z ≠ 1)`.
- `analyticOrderAt_riemannZeta_conj {z : ℂ} (hz : z ≠ 1) (hzeta : riemannZeta z = 0) : analyticOrderAt riemannZeta (conj z) = analyticOrderAt riemannZeta z` — hmm, actually for the order-equality via the iteratedDeriv characterization I need both orders = the SAME nat n. Structure:
```
lemma analyticOrderAt_riemannZeta_conj {z : ℂ} (hz : z ≠ 1) :
analyticOrderAt riemannZeta ((starRingEnd ℂ) z) = analyticOrderAt riemannZeta z := by
-- both ≠ ⊤ via zeta_order_ne_top_of_ne (z ≠ 1, conj z ≠ 1)
-- set n := analyticOrderNatAt ζ z; order z = ↑n (Nat.cast_analyticOrderNatAt)
-- show order (conj z) = ↑n via analyticOrderAt_eq_nat_iff_iteratedDeriv_eq_zero
-- (needs AnalyticAt ζ (conj z) ✓ analyticAt_riemannZeta (conj z ≠ 1))
-- (∀ k < n, itD k ζ (conj z) = 0) ∧ itD n ζ (conj z) ≠ 0
-- via iteratedDeriv_riemannZeta_conj: itD k ζ (conj z) = conj(itD k ζ z)
-- conj x = 0 ⟺ x = 0 (map_eq_zero (starRingEnd ℂ))
-- and the at-z facts from order z = ↑n via the same iff (mpr → mp)
```
The analyticOrderNatAt vs analyticOrderAt bridge: `Nat.cast_analyticOrderNatAt (hf : analyticOrderAt f z₀ ≠ ⊤) : (analyticOrderNatAt f z₀ : ℕ∞) = analyticOrderAt f z₀` (from the Order.lean listing: `@[simp] lemma Nat.cast_analyticOrderNatAt (hf : analyticOrderAt f z₀ ≠ ⊤)` ✓).
Then zeroMult (conj ρ) = zeroMult ρ: zeroMult := analyticOrderNatAt: toNat of equal ℕ∞ ✓:
```
lemma zeroMult_conj (ρ : ℂ) (hρ : IsNontrivialZero ρ) :
zeroMult ((starRingEnd ℂ) ρ) = zeroMult ρ := by
rw [zeroMult, zeroMult, analyticOrderAt_riemannZeta_conj hρ.2.2-ish...]
```
— need conj ρ ≠ 1: conj ρ = 1 ⟺ ρ = 1 (starRingEnd injective/one): ρ nontrivial ⟹ re ρ < 1... actually re ρ ∈ (0,1) so ρ ≠ 1 ✓ and conj ρ ≠ 1 since conj 1 = 1 and conj injective ✓.
zeroMult's def — let me check: from LiSides: `(zeroMult ρ : ℂ) = (analyticOrderNatAt riemannZeta ρ : ℂ)` was rfl — so zeroMult ρ := analyticOrderNatAt riemannZeta ρ ✓. And analyticOrderNatAt f z := (analyticOrderAt f z).toNat ✓ (probably). So:
```
lemma zeroMult_conj {ρ : ℂ} (hρ : IsNontrivialZero ρ) :
zeroMult ((starRingEnd ℂ) ρ) = zeroMult ρ := by
have h1 : ((starRingEnd ℂ) ρ) ≠ 1 := by
intro h
have h2 := hρ.2.2
rw [← (starRingEnd ℂ).injective h] at h2 -- hmm: conj ρ = 1 ⟹ ρ = conj 1 = 1
...
rw [zeroMult, zeroMult, analyticOrderNatAt, analyticOrderNatAt,
analyticOrderAt_riemannZeta_conj ...]
```
Need to check zeroMult/analyticOrderNatAt defs.
For the iteratedDeriv induction, I need:
- `AnalyticAt.iteratedDeriv`: (analyticAt_riemannZeta hz).iteratedDeriv n? Let me check the name: `AnalyticAt.iteratedDeriv (hf : AnalyticAt 𝕜 f x) : AnalyticAt 𝕜 (iteratedDeriv n f) x`? or via deriv: hf.deriv iterated. Let me grep.
Let me check these API details first, then write §13+§14 together.
Committed 3a. Now checking API details for the conj machinery (analyticOrderNatAt def, AnalyticAt.iteratedDeriv, zeroMult def).
tool: Bash
input
{
"command": "grep -rn \"def analyticOrderNatAt\\|abbrev analyticOrderNatAt\" D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib/Mathlib/ --include=\"*.lean\" 2>/dev/null | head -3; grep -rn \"theorem.*iteratedDeriv\\b.*Analytic\\|AnalyticAt.iteratedDeriv\\|AnalyticAt.deriv\\b\" D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib/Mathlib/Analysis/Analytic/IteratedFDeriv.lean 2>/dev/null | head -6; grep -rn \"def zeroMult\" D:/Python/Quantum/research/lean/NguyenRH1/NguyenRH1/*.lean D:/Python/Quantum/research/lean/NguyenRH1/../../../zeta-23-lean/Zeta23/*.lean 2>/dev/null | head -3",
"description": "Check analyticOrderNatAt/iteratedDeriv/zeroMult definitions"
}
raw content_json (database row)
[{"type":"thinking","thinking":"Committed (79c506b). Wait — 2001 insertions and 817 DELETIONS? The deletions are because my Edit rewrote section 9's earlier versions. Fine.\n\nNow piece 3b: the C0hat bridges + conj machinery.\n\n**C0hat bridges** (§13):\n1. `C0hat_two_mul_add_one_le (k : ℕ) (hk : 10 ≤ k) : C0hat (2*(k:ℝ)+1) ≤ 0.433 * (Real.log k + 0.833) + 0.886 * (Real.log (Real.log k) + 0.3475) + 2.9`\n C0hat(2k+1) = 0.433·log(2k+3) + 0.886·loglog(2k+3) + 2.9.\n - log(2k+3) ≤ log k + 0.833: 2k+3 ≤ 2.3k ⟺ 3 ≤ 0.3k ⟺ k ≥ 10 ✓: log(2k+3) ≤ log(2.3k) = log 2.3 + log k ≤ 0.833 + log k (log_two_point_three_le ✓).\n - loglog(2k+3) ≤ loglog k + 0.3475: log(2k+3) ≤ log k + 0.833 ⟹ loglog(2k+3) ≤ log(log k + 0.833) ≤ loglog k + 0.833/log k ≤ loglog k + 0.833/log 11 ≤ loglog k + 0.3475 (log 11 ≥ 2.3978: 0.833/2.3978 = 0.34740 ≤ 0.3475 ✓). Need: log(a+c) ≤ log a + c/a (a > 0, c ≥ 0): log(a+c) − log a = log(1+c/a) ≤ c/a (log(1+u) ≤ u ✓ Real.log_le_sub_one_of_pos with 1+u = 1+c/a).\n Also need log k ≥ log 11 > 0 for the division: k ≥ 11 ✓ (hk : 10 ≤ k gives k ≥ 10 — the 2k+3 ≤ 2.3k needs k ≥ 10 ✓ and log k ≥ log 10 ≥ 2.3025: 0.833/2.3025 = 0.36177 ≤ 0.3475?? 0.833/2.3025 = 0.36178 > 0.3475!! — hmm: for k = 10: 0.833/log 10 = 0.833/2.302585 = 0.36177 > 0.3475!! So the 0.3475 bound FAILS at k = 10?!!\n \n Wait — for k = 10: C0hat(2·10+1) = C0hat(21) = 0.433·log 23 + 0.886·loglog 23 + 2.9 = 0.433·3.13549+0.886·1.14289+2.9 = 1.35768+1.01260+2.9 = 5.27028. The bound: 0.433·(log 10+0.833)+0.886·(loglog 10+0.3475)+2.9 = 0.433·(2.30259+0.833)+0.886·(0.83403+0.3475)+2.9 = 0.433·3.13559+0.886·1.18153+2.9 = 1.35771+1.04684+2.9 = 5.30455 ≥ 5.27028 ✓ holds! Because the loglog-increment bound: loglog(2k+3) − loglog k ≤ 0.833/log k — at k = 10: loglog 23 − loglog 10 = 1.14289−0.83403 = 0.30886 ≤ 0.3475 ✓ — the TRUE increment is 0.31, and my crude bound 0.833/log k = 0.3618 also exceeds it, but I bounded 0.833/log 10 ≤ 0.3475 which is FALSE (0.3618 > 0.3475). But the FINAL bound still holds because the increment is really ≤ 0.833/log k and then I need 0.833/log k ≤ 0.3475 — FALSE at k = 10. Hmm — but wait: do I need the increment ≤ 0.3475 at k = 10, or can I use the TRUE increment at k = 10? The tail bricks start at k ≥ 11, so the C0hat(2k+1) form is only needed for k ≥ 11!! At k ≥ 11: log k ≥ log 11 ≥ 2.3978, 0.833/2.3978 = 0.34740 ≤ 0.3475 ✓. So state the bridge with (hk : 11 ≤ k). At k = 10, the main range uses C0hat(t+k+1) ≤ C0hat(2t+1) — different lemma. So: `C0hat_two_mul_add_one_le (k : ℕ) (hk : 11 ≤ k)`. ✓\n\n Proof structure:\n ```\n lemma C0hat_two_mul_add_one_le {k : ℕ} (hk : 11 ≤ k) :\n C0hat (2 * (k : ℝ) + 1)\n ≤ 0.433 * (Real.log k + 0.833) + 0.886 * (Real.log (Real.log k) + 0.3475) + 2.9 := by\n have hkR : (11 : ℝ) ≤ (k : ℝ) := by exact_mod_cast hk\n have hk0 : (0 : ℝ) < (k : ℝ) := by linarith\n -- log(2k+3) ≤ log k + 0.833\n have h1 : Real.log (2 * (k : ℝ) + 1 + 2) ≤ Real.log k + 0.833 := by\n have h2 : (2 : ℝ) * (k : ℝ) + 3 ≤ 2.3 * (k : ℝ) := by linarith [hkR]\n have h3 : Real.log (2 * (k : ℝ) + 3) ≤ Real.log (2.3 * (k : ℝ)) :=\n Real.log_le_log (by positivity) h2\n have h4 : Real.log (2.3 * (k : ℝ)) = Real.log 2.3 + Real.log k :=\n Real.log_mul (by norm_num : (2.3 : ℝ) ≠ 0) hk0.ne'\n have h5 := log_two_point_three_le\n have h6 : 2 * (k : ℝ) + 1 + 2 = 2 * (k : ℝ) + 3 := by ring\n rw [h6, h4] at h3\n linarith [h3, h5]\n -- loglog(2k+3) ≤ loglog k + 0.3475\n have h2 : Real.log (Real.log (2 * (k : ℝ) + 1 + 2)) ≤ Real.log (Real.log k) + 0.3475 := by\n have hlogk : (2.3978 : ℝ) ≤ Real.log k := by\n have h2a := log_eleven_ge\n have h2b : Real.log 11 ≤ Real.log k := Real.log_le_log (by norm_num) hkR\n linarith [h2a, h2b]\n have h3 : Real.log (Real.log (2 * (k : ℝ) + 3)) ≤ Real.log (Real.log k + 0.833) :=\n Real.log_le_log (by positivity : (0:ℝ) < Real.log (2*(k:ℝ)+3)) h1\n -- log(a+c) ≤ log a + c/a\n have h4 : Real.log (Real.log k + 0.833) ≤ Real.log (Real.log k) + 0.833 / Real.log k := by\n have ha : (0 : ℝ) < Real.log k := by linarith [hlogk]\n have h5 : Real.log (Real.log k + 0.833) = Real.log (Real.log k * (1 + 0.833 / Real.log k)) := by\n rw [show Real.log k + 0.833 = Real.log k * (1 + 0.833 / Real.log k) from by\n field_simp [ha.ne']\n ring]\n rw [h5, Real.log_mul ha.ne' (by positivity : (1 : ℝ) + 0.833 / Real.log k ≠ 0)]\n have h6 : Real.log (1 + 0.833 / Real.log k) ≤ 0.833 / Real.log k :=\n Real.log_le_sub_one_of_pos (by positivity : (0:ℝ) < 1 + 0.833 / Real.log k)\n linarith [h6]\n have h7 : (0.833 : ℝ) / Real.log k ≤ 0.3475 := by\n have ha : (0 : ℝ) < Real.log k := by linarith [hlogk]\n rw [div_le_iff₀ ha]\n have h8 : (0.3475 : ℝ) * 2.3978 ≤ 0.3475 * Real.log k :=\n mul_le_mul_of_nonneg_left hlogk (by norm_num)\n have h9 : (0.833 : ℝ) ≤ 0.3475 * 2.3978 := by norm_num\n exact h9.trans h8\n -- assemble\n have h10 : Real.log (2 * (k : ℝ) + 1 + 2) = Real.log (2 * (k : ℝ) + 3) := by\n congr 1; ring\n rw [h10]\n have h11 : Real.log (2 * (k : ℝ) + 3) ≤ Real.log k + 0.833 := h1'\n ...\n -- unfold C0hat and combine\n rw [C0hat]\n have harg : (2 : ℝ) * (k : ℝ) + 1 + 2 = 2 * (k : ℝ) + 3 := by ring\n -- C0hat y = 0.433 log(y+2) + 0.886 loglog(y+2) + 2.9 with y = 2k+1: y+2 = 2k+3\n ...\n ```\n Need to be careful with the h1/h1' duplication. Let me structure cleanly in the actual code.\n\n2. `C0hat_add_one_le_of_fourteen_le {j : ℕ} (hj : 14 ≤ j) : C0hat ((j:ℝ)+1) ≤ 0.433 * (Real.log j + 0.1942) + 0.886 * (Real.log (Real.log j) + 0.0736) + 2.9`\n - log(j+3) ≤ log j + 0.1942: j+3 ≤ (17/14)j ⟺ 3 ≤ (3/14)j ⟺ j ≥ 14 ✓: log(j+3) ≤ log((17/14)j) = log(17/14)+log j ≤ 0.1942+log j (log_17_14_le ✓).\n - loglog(j+3) ≤ loglog j + 0.1942/log j ≤ loglog j + 0.1942/log 14 ≤ loglog j + 0.0736 (log 14 ≥ 2.6388: 0.1942/2.6388 = 0.073594 ≤ 0.0736 ✓).\n\n3. `C0hat_two_t_add_one_le {t : ℝ} (ht : 10 ≤ t) : C0hat (2*t+1) ≤ C0hat (t+1) + 0.55`\n diff = 0.433·log((2t+3)/(t+3)) + 0.886·[loglog(2t+3)−loglog(t+3)]:\n - log((2t+3)/(t+3)) = log(2t+3) − log(t+3) ≤ log 2 ≤ 0.6932 (2t+3 ≤ 2(t+3) ⟹ log(2t+3) ≤ log 2 + log(t+3)).\n - loglog(2t+3) − loglog(t+3) ≤ log 2/log(t+3) ≤ 0.6932/log 13 ≤ 0.6932/2.5649 = 0.27027·... hmm need log 13 ≥ 2.5649 — I don't have that lemma (decided unneeded earlier)! 0.6932/log 13 with log 13 ≥ ?: use log 13 ≥ 1: 0.6932/1 = 0.6932 ✗ too big. log 13 ≥ 2: 13 ≥ e² = 7.389 ✓ EASY (e² ≤ 7.3890566 ≤ 13): 0.6932/2 = 0.3466 ✗ too big (need ≤ 0.27027+). log 13 ≥ 2.5: 13 ≥ e^2.5 = 12.1825 ✓ (e^2.5 = e²·e^0.5 ≤ 7.3890566·1.6487 = 12.183 ≤ 13 ✓): 0.6932/2.5 = 0.27728 ✗ (need ≤ 0.2703 — 0.27728 > 0.2703!). Hmm — the budget: diff ≤ 0.433·0.6932+0.886·X ≤ 0.55 ⟺ 0.30016+0.886X ≤ 0.55 ⟺ X ≤ 0.28203. So need loglog-increment ≤ 0.28203: 0.6932/log 13 ≤ 0.28203 ⟺ log 13 ≥ 2.4577: 13 ≥ e^2.4577 = 11.678 ✓ (e^2.4577 = e²·e^0.4577 ≤ 7.3890566·1.5805 = 11.677 ≤ 13 ✓). So: log 13 ≥ 2.4577 via 13 ≥ e^2.4577 (e^0.4577 ≤ 1.5805: partial sums? — need exp UPPER again! e^0.4577 ≤ 1.5805: (1−0.4577/n)^{-n}... e^0.4577 ≤ 1/(1−0.4577) = 1.8443 ✗; e^0.4577 = (e^0.4577/2)² ≤ (1/(1−0.22885))² = 1.2971² = 1.6825 ✗; n=4: 1/(1−0.114425)⁴ = 1.12925⁴ = 1.6268 ✗; n=8: (1−0.0572)^{-8}: 0.94279^8 = 0.62405·... 1/0.62405 = 1.60244 ✗; true e^0.4577 = 1.58040. n=16: (1−0.02860625)^{-16}: (0.97139)^{16} = e^{16·ln 0.97139} = e^{16·(−0.029023)} = e^{−0.46437} = 0.62854: 1/0.62854 = 1.59095 ✗. n=32: ≈1.5857 ✗. Converges to 1.5804 slowly. Hmm.\n \n ALTERNATIVE for the loglog-increment: loglog(2t+3) − loglog(t+3) = log(log(2t+3)/log(t+3)) ≤ (log(2t+3)/log(t+3)) − 1 = (log(2t+3)−log(t+3))/log(t+3) ≤ log 2/log(t+3) ≤ 0.6932/log 13. And log 13: I DO have log_thirteen_le (log 13 ≤ 2.565, upper) but need lower: log 13 ≥ 2.4577-ish. Get log 13 ≥ 2.5 via 13 ≥ e^2.5: e^2.5 ≤ 13 ⟺ ... e^2.5 = e²·√e ≤ 7.3890566·1.6488: need √e ≤ 1.6488 ⟺ e ≤ 1.6488² = 2.71854·... e ≤ 2.7182819 ✓ and 1.6488² = 2.71854 ≥ 2.7182819 ✓!! So e^2.5 = e²·e^0.5 ≤ 7.3890566·1.6488 = 12.18319 ≤ 13 ✓ — provable: e^0.5 ≤ 1.6488 ⟺ e ≤ 1.6488² (Real.le_sqrt route: e^0.5 = √e — Real.exp_half? or via Real.exp 0.5 = Real.sqrt (Real.exp 1)? there's `Real.exp_half : exp (1/2) = sqrt e`? or exp_nat_mul inverse. Hmm: (e^0.5)² = e — e^0.5 ≤ 1.6488 ⟸ (e^0.5)² ≤ 1.6488² ⟸ e ≤ 2.71854 ✓ — with e^0.5 ≥ 0: pow_le_pow_left₀: e^0.5 ≤ 1.6488 ⟸ e ≤ 1.6488²: need the SQ relation: (Real.exp 0.5)^2 = Real.exp 1: rw [← Real.exp_add]: exp 0.5·exp 0.5 = exp(0.5+0.5) = exp 1 ✓. So: h : Real.exp 0.5 * Real.exp 0.5 = Real.exp 1 := by rw [← Real.exp_add]; congr 1; ring. Then e^2.5 = e²·e^0.5: Real.exp 2.5 = exp(2+0.5) = exp 2·exp 0.5: rw [show (2.5:ℝ) = 2+0.5 from by norm_num, Real.exp_add]; exp 2 = (exp 1)² via exp_nat_mul or exp_add. Then bound ≤ 7.3890566·1.6488 ≤ 13 (norm_num).\n So: `log_thirteen_ge : (2.5 : ℝ) ≤ Real.log 13` — via 13 ≥ e^2.5 ⟹ log 13 ≥ 2.5 (Real.le_log_iff_exp_le). Then loglog-increment ≤ 0.6932/2.5 = 0.27728 ≤ 0.28203 ✓. Then diff ≤ 0.433·0.6932 + 0.886·0.27728 = 0.30016+0.24567 = 0.54583 ≤ 0.55 ✓ (margin 4.2e-3 — thin but OK).\n Actually let me double-check the diff bound is tight enough: TRUE diff at t = 10: C0hat(21)−C0hat(11) = 5.27028−(0.433·log 13+0.886·loglog 13+2.9) = 5.27028−(0.433·2.56495+0.886·0.94086+2.9) = 5.27028−(1.11062+0.83360+2.9) = 5.27028−4.84422 = 0.42606 ≤ 0.55 ✓ (true margin 0.12 — the slack in my bound is the loglog-increment overestimate: true = log(log 23/log 13) = log(1.22238) = 0.20072 vs my 0.27728 — 0.077 slack ✓ fine).\n\n4. Also need: `C0hat_two_le_of...`? No — the main bucket count uses C0hat(t−k) ≤ C0hat(t+1) via C0hat_mono (exists, needs 1 ≤ t−k: for k ≤ t−3: t−k ≥ 3 ≥ 1 ✓; C0hat_mono (1 ≤ a) (a ≤ b) ✓).\n\n**zeroMult_conj machinery** (§14):\n- `hasDerivAt_conj_of_conj_eq` (general conj-deriv lemma).\n- `iteratedDeriv_riemannZeta_conj (n : ℕ) {z : ℂ} (hz : z ≠ 1)`.\n- `analyticOrderAt_riemannZeta_conj {z : ℂ} (hz : z ≠ 1) (hzeta : riemannZeta z = 0) : analyticOrderAt riemannZeta (conj z) = analyticOrderAt riemannZeta z` — hmm, actually for the order-equality via the iteratedDeriv characterization I need both orders = the SAME nat n. Structure:\n ```\n lemma analyticOrderAt_riemannZeta_conj {z : ℂ} (hz : z ≠ 1) :\n analyticOrderAt riemannZeta ((starRingEnd ℂ) z) = analyticOrderAt riemannZeta z := by\n -- both ≠ ⊤ via zeta_order_ne_top_of_ne (z ≠ 1, conj z ≠ 1)\n -- set n := analyticOrderNatAt ζ z; order z = ↑n (Nat.cast_analyticOrderNatAt)\n -- show order (conj z) = ↑n via analyticOrderAt_eq_nat_iff_iteratedDeriv_eq_zero\n -- (needs AnalyticAt ζ (conj z) ✓ analyticAt_riemannZeta (conj z ≠ 1))\n -- (∀ k < n, itD k ζ (conj z) = 0) ∧ itD n ζ (conj z) ≠ 0\n -- via iteratedDeriv_riemannZeta_conj: itD k ζ (conj z) = conj(itD k ζ z)\n -- conj x = 0 ⟺ x = 0 (map_eq_zero (starRingEnd ℂ))\n -- and the at-z facts from order z = ↑n via the same iff (mpr → mp)\n ```\n The analyticOrderNatAt vs analyticOrderAt bridge: `Nat.cast_analyticOrderNatAt (hf : analyticOrderAt f z₀ ≠ ⊤) : (analyticOrderNatAt f z₀ : ℕ∞) = analyticOrderAt f z₀` (from the Order.lean listing: `@[simp] lemma Nat.cast_analyticOrderNatAt (hf : analyticOrderAt f z₀ ≠ ⊤)` ✓).\n Then zeroMult (conj ρ) = zeroMult ρ: zeroMult := analyticOrderNatAt: toNat of equal ℕ∞ ✓:\n ```\n lemma zeroMult_conj (ρ : ℂ) (hρ : IsNontrivialZero ρ) :\n zeroMult ((starRingEnd ℂ) ρ) = zeroMult ρ := by\n rw [zeroMult, zeroMult, analyticOrderAt_riemannZeta_conj hρ.2.2-ish...]\n ```\n — need conj ρ ≠ 1: conj ρ = 1 ⟺ ρ = 1 (starRingEnd injective/one): ρ nontrivial ⟹ re ρ < 1... actually re ρ ∈ (0,1) so ρ ≠ 1 ✓ and conj ρ ≠ 1 since conj 1 = 1 and conj injective ✓.\n zeroMult's def — let me check: from LiSides: `(zeroMult ρ : ℂ) = (analyticOrderNatAt riemannZeta ρ : ℂ)` was rfl — so zeroMult ρ := analyticOrderNatAt riemannZeta ρ ✓. And analyticOrderNatAt f z := (analyticOrderAt f z).toNat ✓ (probably). So:\n ```\n lemma zeroMult_conj {ρ : ℂ} (hρ : IsNontrivialZero ρ) :\n zeroMult ((starRingEnd ℂ) ρ) = zeroMult ρ := by\n have h1 : ((starRingEnd ℂ) ρ) ≠ 1 := by\n intro h\n have h2 := hρ.2.2\n rw [← (starRingEnd ℂ).injective h] at h2 -- hmm: conj ρ = 1 ⟹ ρ = conj 1 = 1\n ...\n rw [zeroMult, zeroMult, analyticOrderNatAt, analyticOrderNatAt,\n analyticOrderAt_riemannZeta_conj ...]\n ```\n Need to check zeroMult/analyticOrderNatAt defs.\n\nFor the iteratedDeriv induction, I need:\n- `AnalyticAt.iteratedDeriv`: (analyticAt_riemannZeta hz).iteratedDeriv n? Let me check the name: `AnalyticAt.iteratedDeriv (hf : AnalyticAt 𝕜 f x) : AnalyticAt 𝕜 (iteratedDeriv n f) x`? or via deriv: hf.deriv iterated. Let me grep.\n\nLet me check these API details first, then write §13+§14 together.","signature":""},{"type":"text","text":"Committed 3a. Now checking API details for the conj machinery (analyticOrderNatAt def, AnalyticAt.iteratedDeriv, zeroMult def)."},{"type":"tool_use","id":"Bash_128","name":"Bash","input":{"command":"grep -rn \"def analyticOrderNatAt\\|abbrev analyticOrderNatAt\" D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib/Mathlib/ --include=\"*.lean\" 2>/dev/null | head -3; grep -rn \"theorem.*iteratedDeriv\\b.*Analytic\\|AnalyticAt.iteratedDeriv\\|AnalyticAt.deriv\\b\" D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib/Mathlib/Analysis/Analytic/IteratedFDeriv.lean 2>/dev/null | head -6; grep -rn \"def zeroMult\" D:/Python/Quantum/research/lean/NguyenRH1/NguyenRH1/*.lean D:/Python/Quantum/research/lean/NguyenRH1/../../../zeta-23-lean/Zeta23/*.lean 2>/dev/null | head -3","description":"Check analyticOrderNatAt/iteratedDeriv/zeroMult definitions"},"extra_content":null}]