← Session 18 — Lean tier (ii): finite-height proof + certified base points
thinking (18791 chars)
Values confirmed:
- marginTilde FAlt 80000 ≈ 15763.79 (vs FTru 16020.20 ✓ matches E-029's 16020 and my FAlt-slack estimate ~256)
- margiñ′ FAlt(80000) ≈ 3.686
So the Lean goals:
- `0 < marginTilde FAlt 80000` — margin ~15764. Strategy: prove `marginTilde FAlt 80000 > 10000` say, via:
- LOWER bound sInftyLower(80000) ≥ 330000 (need lower bound on log 80000)
- UPPER bound Bn FAlt 80000 ≤ 330000-ish... need margin slack: slower_low − Bn_up + 1 > 0. With true values 338072 − 322309 = 15763, I have room for ~15000 of sloppiness. Target: slower(80000) ≥ 337000 (needs log 80000 ≥ 11.283 true 11.2898 — err ~0.007·80000/2 = 280), Bn ≤ 337000/2... let me be careful: need slower_lo − Bn_hi + 1 > 0 with slower_lo ≥ 338072 − δ₁ and Bn_hi ≤ 322309 + δ₂, need δ₁ + δ₂ < 15764. Very generous.
Component bounds needed:
- sInftyLower(80000) = (1/2)(80000) log 80000 + (C₁−γ/2)(80000) − 4.
- log 80000: 80000 = 8·10⁴. log 80000 = log 8 + log 10⁴ = 3 log 2 + 4 log 10. Need log 10. Or: bound 80000 between powers of e? log 80000 ≥ 11.28 ⟺ 80000 ≥ e^11.28. e^11.28 = e^11 · e^0.28. e^11 = 59874.1; e^0.28 ≈ 1.3231 → 79203 ≤ 80000 ✓. In Lean: Real.exp 11.28 ≤ 80000 via... exp 11.28 = exp(11)·exp(0.28)... The file's pattern: Real.sum_le_exp_of_nonneg for lower bounds on exp. e^11.28 via partial sums is painful for x=11.28 (needs many terms). Alternative: log 80000 ≥ 11.28 via 80000 ≥ e^11.28. Hmm.
Better approach: use log 2 bounds (Mathlib: Real.log_two_gt_d9 : 0.6931471803 < log 2; Real.log_two_lt_d9 : log 2 < 0.6931471808) and build log 80000 = 3 log 2 + 4 log 10 with log 10 = log 2 + log 5, log 5 = log 5... Mathlib has Real.log_five? No. But: log 5 = log(10/2) circular. log 10: no direct Mathlib d9. Derive: 10 = 2·5, log 5 = −log(1/5) = −log 0.2... hmm. log 5 = log(e^?)... Use: log 5 ≤ 1.61 ⟺ 5 ≤ e^1.61; e^1.61 ≥ 1 + 1.61 + 1.61²/2 + ... + 1.61⁷/7! — partial sum at 7 terms: 1+1.61+1.296+0.695+0.280+0.0902+0.0242+0.00557 = 5.001 ✓ (Real.sum_le_exp_of_nonneg with n=7). And log 5 ≥ 1.609 ⟺ e^1.609 ≤ 5: upper bound on exp — harder (exp partial sums are LOWER bounds for x ≥ 0). Upper bound on exp via exp x ≤ 1/(1−x+...) no... Standard trick: e^x ≤ 1/(Σ ...) no. For UPPER bound on log: log 5 ≤ 1.61 ⟸ 5 ≤ e^1.61 ⟸ partial sum ≤ e^1.61 — wait direction: sum_le_exp: Σ_{i<7} xⁱ/i! ≤ e^x for x ≥ 0. So partial sum 5.001 ≤ e^1.61 ⟹ 5 ≤ 5.001 ≤ e^1.61 ⟹ log 5 ≤ 1.61 ✓ (Real.log_le_log). For LOWER bound log 5 ≥ c: need e^c ≤ 5: upper-bound e^c. e^1.609: can't partial-sum upper bound directly. Trick: e^c ≤ 5 ⟸ e^c ≤ (something computable). Use e^c = 1/e^{−c}; e^{−c} ≥ partial sum of −c? For x < 0 the alternating series... sum_le_exp needs x ≥ 0.
Alternative for lower bounds on log: Real.log_le_sub_one_of_pos gives log x ≤ x − 1 (UPPER bound on log). Lower bound on log: Real.one_sub_le_log? hmm: `Real.le_log_iff_exp_le`... There's `Real.log_le_sub_one_of_pos` (upper) and... for lower: log x ≥ (x−1)/x? That's log x = −log(1/x) ≥ −(1/x − 1) = 1 − 1/x. So log 5 ≥ 1 − 1/5 = 0.8 — too weak.
Hmm. Better: use log 80000 directly with powers: 80000 = e^? ... Actually cleanest: bound log 80000 between RATIONAL bounds via e-power comparisons with INTEGER or simple-fraction exponents computed by repeated squaring of exp 1 bounds! We have Real.exp_one_lt_d9 (e < 2.7182818286) and Real.exp_one_gt_d9 (2.7182818283 < e)? Mathlib: Real.exp_one_lt_d9 : Real.exp 1 < 2.7182818286 and Real.exp_one_gt_d9 : 2.7182818283 < Real.exp 1. Then e^11 = (e^1)^11 — boundable by norm_num via pow! e^11 ≥ 2.7182818283^11 = 59874.13... and ≤ 2.7182818286^11 = 59874.20... Then e^11.28: 0.28 fractional — problem: rpow. Use e^{11.28} = e^11 · e^0.28; e^0.28 ≤ ? partial sums give LOWER bounds for e^0.28; upper bound on e^0.28 via e^0.28 = 1/e^{-0.28}...
Simpler: avoid fractional exponents entirely. Choose the log bound grid at INTEGER exponents:
- log 80000: e^11 ≤ 59874.2 < 80000 ⟹ log 80000 > 11. e^12 ≥ 59874·2.71828 ≥ 162750 > 80000 ⟹ log 80000 < 12. So 11 < log 80000 < 12 — gives slower ∈ [(0.5·80000·11 − 1.41894·80000 − 4), (0.5·80000·12 − ...)] = [440000 − 113515 − 4, ...] = [326481, 366485]. That's δ₁ = 11591 below true — eats most of the 15764 slack alone. Combined with Bn side it might JUST fail. Too coarse.
Need finer: quarter-integer exponents? e^{0.25} = sqrt(sqrt(e))... Real.sqrt bounds... e^{11.25} = e^11 · e^{1/4}: e^{1/4} bounds via sqrt: e^{1/4} = sqrt(sqrt(e^1))... Real.exp (1/4) = sqrt(exp (1/8))? no — exp(1/4) = sqrt(exp(1/2)) = sqrt(sqrt(exp 1)). exp(1/2) = sqrt(exp 1)? Real.exp_half? There IS Real.exp_half? Hmm: Real.exp_mul... exp(2·(1/4)) = exp(1/2): (exp(1/4))² = exp(1/2) via ← Real.exp_add. So exp(1/4) = sqrt(exp(1/2)) with nonneg. This is getting deep.
ALTERNATIVE STRATEGY — much better: bound log at 80000 via log 80000 = log 8 + log 10000 = 3 log 2 + 8 log 10^{1/2}... no. log 10000 = log(10⁴) = 4 log 10. log 10 = log 2 + log 5. So need log 5 bounds. log 5: 5 = e^1·(5/e) — log 5 = 1 + log(5/e). 5/e ∈ [5/2.7183, 5/2.7182] = [1.8389, 1.8390]. log(1.839): 1.839 = ? Use log_le_sub_one_of_pos: log x ≤ x−1 = 0.839 (too weak). Hmm.
log 5 via 5 = 4·(5/4): log 5 = 2 log 2 + log(5/4). log(5/4): upper: log(5/4) ≤ 1/4 (log_le_sub_one). Lower: log(5/4) = −log(4/5) ≥ −(4/5 − 1) = 1/5. So log(5/4) ∈ [0.2, 0.25]. log 5 ∈ [2·0.6931471 + 0.2, 2·0.6931472 + 0.25] = [1.5862942, 1.6362944]. Width 0.05 — too coarse for the 4 log 10 term (×4·80000·0.5... log 80000 = 3 log 2 + 4(log 2 + log 5) = 7 log 2 + 4 log 5: error 4·0.05 = 0.2 → slower error 0.5·80000·0.2 = 8000. Hmm borderline.
Refine log(5/4) via the alternating series for log(1+x): log(1.25) = Σ (−1)^{k+1} x^k/k, x = 0.25. Alternating with decreasing terms: truncate: 0.25 − 0.03125 + 0.0052083 − 0.0009766 + 0.0001953 = 0.223426… next term −0.0000407. So log(5/4) ∈ [0.22339, 0.22347] with 6 terms. In Lean: alternating series bounds — provable via... this is Real.log 1.25 — is there a Mathlib lemma? There's `Real.log_one_add_le`? The cleanest in-Lean technique for tight log bounds at specific points: use Real.log_div + known d9 constants...
ALTERNATIVELY — completely different tactic: log 80000 = log(8) + log(10⁴) needs log 10. What about: log(80000) = log(65536 · 1.2207) = 16 log 2 + log(1.2207). 65536 = 2^16! 80000/65536 = 1.220703. log(1.220703): alternating series x = 0.220703: terms decrease (x < 1): log(1.2207) ≈ 0.19931. Bounds via alternating series: provable in Lean via Real.log_le_sub_one... no, need a SERIES bound. Mathlib: Real.log_one_add_...? There's `Real.log_le_sub_one_of_pos`, and lower bound `Real.one_sub_inv_le_log_of_pos`? Something like 1 − 1/x ≤ log x? Real.one_sub_inv_le_log? If exists: 1 − 1/x ≤ log x ≤ x − 1 — at x = 1.2207: [0.1809, 0.2207] — too coarse.
Better Lean-native approach: rpow-based comparison. log 80000 ≥ c ⟺ 80000 ≥ exp(c). For c = 11.2898: exp(11.2898) = exp(11)·exp(0.2898). exp(0.2898) upper bound: exp(0.2898) ≤ 1/(1 − 0.2898 + 0.2898²/2 − ...) hmm alternating again.
You know what — Mathlib HAS tight bounds for log 2 only (d9). But there's ALSO `Real.log_two_gt_d9` and possibly bounds for log of other small integers in recent Mathlib? Let me grep: Real.log_three, log_five... I don't think so.
PRAGMATIC CHOICE: the cleanest high-precision primitive available is `Real.sum_le_exp_of_nonneg` (lower bound on exp via partial sums) for proving log x ≤ c (via x ≤ partial_sum ≤ exp c — wait no: log x ≤ c ⟺ x ≤ exp c; partial sums give LOWER bounds on exp c, i.e. p ≤ exp c. If x ≤ p then x ≤ exp c ✓ so log x ≤ c. YES: log x ≤ c is provable by exhibiting a partial sum p with x ≤ p ≤ exp c!
And log x ≥ c ⟺ x ≥ exp c: need UPPER bound on exp c. For c > 0: exp c = 1/exp(−c)... exp(−c) for c > 0: −c < 0, partial sums alternate... no direct.
exp c upper via exp c ≤ (something)^(k) trick: exp c = (exp(c/m))^m and exp(c/m) ≤ 1/(1 − c/m − ...)...
Hmm OK here's the cleanest upper-bound-on-exp trick: for 0 ≤ x < 1... we have exp(−x) ≥ 1 − x (Real.one_sub_le_exp? hmm — actually exp(−x) ≥ 1 − x is Bernoulli-ish: exp(−x) ≥ 1 + (−x) = 1 − x from Real.add_one_le_exp? `Real.add_one_le_exp : x + 1 ≤ Real.exp x` for all real x ✓ (I think exists). Then exp(x) = 1/exp(−x) ≤ 1/(1−x) for x < 1. So exp x ≤ 1/(1−x) — crude. Better: exp(x) = (exp(x/k))^k ≤ 1/(1−x/k)^k for x < k. With k = 8, x = 0.29: 1/(1−0.03625)^8 = 1/0.96375^8 = 1/0.7442 = 1.3438 (true e^0.29 = 1.3364). Good enough (0.5% error).
This is all doable but LONG. Let me think about the total structure of the base-point proof:
marginTilde FAlt 80000 = slower(80000) − Bn(80000) + 1 > 0.
slower(80000) = (1/2)(80000)(log 80000) + (C₁−γ/2)(80000) − 4 where C₁−γ/2 = (γ−1−log 2π)/2 − γ/2 = −1/2 − (log 2π)/2 − γ/2·... let me just say it's a specific constant ≈ −1.41894. So slower = 40000·log 80000 − 1.41894·80000 − 4 = 40000·log 80000 − 113519.2.
Need: LOWER bound log 80000 ≥ L1, and (C₁−γ/2) = exact expression: the constant involves γ (eulerMascheroniConstant) and log 2π. C₁−γ/2 = (γ − 1 − log 2π)/2 − γ/2 = −(1 + log 2π)/2 = −(1 + log 2 + log π)/2. The γ CANCELS! Nice: (γ − 1 − log 2π)/2 − γ/2 = γ/2 − (1+log 2π)/2 − γ/2 = −(1 + log 2 + log π)/2. So slower(n) = (1/2)n log n − ((1 + log 2 + log π)/2)·n − 4. The γ-free form! In Lean, when I unfold lagariasC1, I get eulerMascheroniConstant terms that cancel by ring — the γ is a variable-like opaque term, ring handles the cancellation ✓.
So slower(80000) = 40000·log 80000 − (1 + log 2 + log π)/2·80000 − 4.
Bn side (upper bounds): T = √80000 + 1 ≤ 284 (since √80000 ≤ 283 ⟸ 80000 ≤ 283² = 80089 ✓... wait need √80000 ≤ 283 ⟺ 80000 ≤ 283² ✓ 80089). Actually T ≤ 284. Components:
- 2 FAlt(T): T·log T term: T ≤ 284, log T ≤ log 284 ≤ ? 284 ≤ e^{5.65}? e^5.65 = e^5·e^0.65: e^5 ≤ 2.7183^5 = 148.42; e^0.65 ≤ 1/(1−0.65/8)^8 = 1/(0.91875)^8 = 1/0.5067 = 1.9735. → 292.9 ≥ 284 ✓ so log 284 ≤ 5.65. Hmm: 148.42·1.9735 = 292.9 ✓. So log T ≤ 5.65 (T ≤ 284 ≤ 292.9 ≤ e^5.65... wait need 284 ≤ e^5.65: 292.9 ≤ e^5.65? NO: 292.9 is my UPPER bound on e^5.65... I need e^5.65 ≥ 284: need LOWER bound on e^5.65: e^5 ≥ 2.7182^5 = 148.32 (norm_num pow of exp_one_gt_d9); e^0.65 ≥ 1 + 0.65 + 0.65²/2 + ... partial sum (Real.sum_le_exp_of_nonneg): Σ_{i<6} 0.65^i/i! = 1 + 0.65 + 0.21125 + 0.04577 + 0.00744 + 0.000967 = 1.9154. e^5.65 ≥ 148.32·1.9154 = 284.09 ≥ 284 ✓ JUST barely (0.03% margin — tight! use more terms: 7 terms: +0.65^6/720 = 0.0001046 → 1.9155; 148.32·1.9155 = 284.10. Tight but OK. Or use 5.66: e^5.66 ≥ 148.32·(partial sum at 0.66) = 1 + .66 + .2178 + .047916 + .007906 + .0010436 + .0001148 = 1.9348 → 148.32·1.9348 = 286.97 ≥ 284 ✓ comfortable.) So log T ≤ 5.66 via T ≤ 284 ≤ 286.9 ≤ e^5.66.
Actually WAIT. Simplification opportunity: since the margin slack is ~15764 and the pieces are computable to within a few units with crude bounds, I could instead prove the STRONGER but simpler statement via very crude bounds with a computer-verified margin. The pieces:
- slower(80000) ≥ 337000: ⟸ 40000·log 80000 − 40000·(1+log 2+log π)·... let me compute (1+log2+logπ)/2 = (1+0.6931+1.1447)/2 = 1.4189. slower = 40000·(log 80000 − 1.4189·2) − 4 = 40000·(log 80000) − 113515 − 4. Need ≥ 337000 ⟺ log 80000 ≥ (337000 + 113519)/40000 = 11.2630. True 11.2898 — margin 0.0268. log 80000 ≥ 11.263 ⟺ 80000 ≥ e^11.263: e^11.263 = e^11·e^0.263: e^11 ≤ 59874.2 (upper); — NO I need e^11.263 ≤ 80000: e^11.263 = e^11 · e^0.263 ≤ [upper e^11]·[upper e^0.263]. Upper e^11 = 2.7182818286^11 — norm_num computes 2.7182818286^11 ≈ 59874.3. Upper e^0.263 = 1/(1−0.263/8)^8 trick: 1/(0.96713)^8 = 1/0.7648 = 1.3075. e^11.263 ≤ 59874.3·1.3075 = 78286 ≤ 80000 ✓ (2.2% margin). So log 80000 ≥ 11.263 provable.
Hmm, but each such bound is a small lemma with Real.sum_le_exp_of_nonneg + pow bounds + Real.log_le_log... Total base-point proof ≈ 300–500 lines of this grind. It's mechanical but long. And the DERIVATIVE base point is worse: deriv (marginTilde FAlt) 80000 — need the explicit deriv expression = deriv of marginExpanded pieces: S′ = (1/2)(log n + 1) + (C₁−γ/2); F-block: −2·F′(T)/(2√n) = −F′(T)/√n; each 4T·g(T) block: derivative = [4g(T) + 4T g′(T)]/(2√n)... all computable but MANY pieces, each needing deriv lemmas + numeric bounds. Probably another 400+ lines.
Time check: this is getting long for the remainder of the session. Per sub-stage rule + break prompt: the notes' step-1 deliverable (assembly modulo SfBound) is DONE and committed. The hbase/hbase′ discharge is "step 2" — mechanical numeric grind. The session-012-notes said step 1 is "achievable in a few sessions" and we did it in one — good.
Decision: do 12.2 partially or defer? Let me assess effort for hbase (margin > 0): ~2-3 hours of Lean grind maybe. hbase′ (deriv > 0): similar or more. Alternatively — a SMARTER approach for hbase′: deriv (marginTilde FAlt) 80000 > 0. We have marginTilde_convex : ConvexOn ... — convexity alone doesn't give the base derivative. Hmm.
Actually — WAIT. There's a much cheaper route to discharge hbase′ (derivative positivity) that avoids ALL numeric evaluation of the derivative: pos_of_convex_of_base uses h0' : 0 < deriv f N₀. Alternative formulation: convexity + positivity at TWO points? If f is convex on [20,∞) and 0 < f(N₀) and f(N₀) < f(N₁) for some N₁ > N₀... then for x ≥ N₁: slope argument gives f(x) ≥ f(N₁) + slope·(x−N₁) where slope = (f(N₁)−f(N₀))/(N₁−N₀) > 0 — by ConvexOn.slope_le or similar (secant slopes increase). That trades the derivative evaluation for a SECOND function evaluation (f at N₁ = e.g. 100000) — much cheaper (no deriv machinery, just another numeric eval of the same kind as hbase, and margin(100000) = 9.3×10⁴ ≫ margin(80000) = 1.6×10⁴ — hugely separated, easy bounds).
ConvexOn.secant: `ConvexOn.slope_le_of...`? The three-chord lemma: for x < y < z in the domain, slope f x y ≤ slope f y z. Mathlib: `ConvexOn.slope_le`? Hmm — there's `ConvexOn.slope_mono`? Let me think of the exact statement needed: for N₀ < N₁ ≤ x: (f(N₁) − f(N₀))/(N₁ − N₀) ≤ (f(x) − f(N₁))/(x − N₁). Then f(x) ≥ f(N₁) + s·(x−N₁) ≥ f(N₁) > 0. The three-chord: ConvexOn.slope_le_adjacent? Search Mathlib for secant: `ConvexOn.secant_mono`? I recall `ConvexOn.slope_mono`... In Convex/Basic or Function.lean: `theorem ConvexOn.slope_le_of...`? There's `ConvexOn.smul_slope...`? Let me grep later. If exists, this avoids the derivative entirely for the main theorem — but the ASSEMBLY's current shape uses pos_of_convex_of_base with h0'. I can prove a variant pos_of_convex_of_two_bases using the secant lemma, and switch the assembly to it. Then discharge = two numeric evals (same machinery twice).
Even better: keep BOTH variants in the file (pos_of_convex_of_base is already proved — keep it as a lemma), add pos_of_convex_of_two_points, and change the main theorem's hypotheses to (hbase : 0 < marginTilde FAlt 80000) (hbase2 : marginTilde FAlt 80000 < marginTilde FAlt 100000). Then discharge both numerically — hbase2 ⟸ margin(80000) ≤ 16000 < 90000 ≤ margin(100000) — generous.
Hmm, but is this BETTER than just evaluating the derivative? The derivative evaluation needs: deriv (marginTilde FAlt) 80000 in closed form. We have all pieces: hasDerivAt_marginS (S′), chain-rule first derivs... but I DON'T have a first-derivative lemma for the full marginExpanded — I'd have to build deriv of each of the 12 blocks at n = 80000 (vF-style first-derivatives — the machinery exists inside chain_rule_sqrt_shift_on's hg1 but not standalone). That's real work. The two-point variant needs ZERO new derivative machinery — just a secant lemma + the same numeric evaluation at a second point. CLEARLY cheaper. Go with two-point.
Mathlib secant lemma: `ConvexOn.slope_le_of_le`? Let me search for the right name. I recall: `ConvexOn.slope_mono`? or `ConvexOn.secant_mono`... In Mathlib/Analysis/Convex/Slope.lean: theorems like `ConvexOn.slope_mono`... let me grep.
Also for hbase: is there an even cheaper trick? margin(80000) > 0 needs ONE numeric evaluation — unavoidable (it's the actual content). OK.
So 12.2 revised plan:
1. pos_of_convex_of_two_points lemma (secant slope).
2. Rewrite assembly: hypotheses (hbase : 0 < marginTilde FAlt 80000) (hbase2 : marginTilde FAlt 80000 < marginTilde FAlt 100000).
3. Numeric discharge: margin_lower_bound lemmas:
- `marginTilde_FAlt_80000_pos : 0 < marginTilde FAlt 80000` via slower ≥ X, Bn ≤ Y.
- `marginTilde_FAlt_100000_lower : marginTilde FAlt 100000 > marginTilde FAlt 80000` via margin(100000) ≥ 90000-ish and margin(80000) ≤ 16000-ish — need BOTH-sided bounds (upper on margin(80000): slower(80000) ≤ ... and Bn ≥ ...). Two-sided numeric work at both points. That's 4 bounding computations. Each is the same kind of log/exp/sqrt rational grind.
Total: significant but tractable. This is the grind the notes anticipated ("a few sessions"). Given how much time the assembly took, let me pace: the notes say NO RUSH. The break-prompt rule: approaching 5 PM ask user. I don't know the current time... The session has been going a while. The milestone is committed. Let me continue with the secant variant + numeric grind, but STRUCTURE it so partial progress commits cleanly.
Actually — let me reconsider scope. What remains for the FULL notes step-1 deliverable? The notes say: "state lambda_pos_finite_height with SfBound named hypothesis, discharge the full assembly conditional on it. ... That's honest, precise, and achievable in a few sessions." The base points weren't explicitly mentioned in the notes — they're part of "the full assembly". The current committed state HAS the assembly conditional on SfBound + 2 elementary numeric facts. The honest paper claim is already upgraded: "verified modulo one named analytic hypothesis + the computational perimeter + two elementary numeric evaluations (E-028/E-029-verified values)".
12.2 (numeric discharge) is genuinely valuable but mechanical; 12.3 (triage doc D-062) is the notes' step-2 design work ("decide deliberately where the perimeter goes") — arguably the more important intellectual content, and the notes explicitly want the triage DECISION.
Plan: do the secant variant (cheap, removes the derivative hypothesis — improves the interim state), then write D-062 triage + journal/STATE/db updates + commit, and LEAVE the numeric discharge (hbase/hbase2) as an explicitly-scoped next-session task with the bounds pre-computed (I have the values: need log 80000 ≥ 11.263 etc.). Actually — hmm, if I'm doing the secant variant I should at least ALSO attempt the numeric discharge since it's the same session's theme. Let me first check the secant lemma name, then decide based on remaining budget. Let me also quickly reconsider: maybe just do the numeric discharge NOW with the derivative version... no — secant is strictly cheaper.
Let me grep for the secant/slope lemma.
Base values confirmed: margin(FAlt) = 15763.79 at 80 000, deriv ≈ 3.686.
Design improvement before grinding numerics: replace the derivative base point with a **second evaluation point** — convexity + `f(80 000) > 0` + `f(80 000) < f(100 000)` gives tail positivity by the secant-slope lemma, avoiding all derivative-evaluation machinery (margin(10⁵) ≈ 9.3×10⁴, hugely separated). Checking the Mathlib secant lemma name.
tool: Bash
input
{
"command": "grep -rn \"theorem ConvexOn.slope\\|lemma ConvexOn.slope\" D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib/Mathlib/Analysis/Convex/Slope.lean | head -12",
"description": "Find secant slope monotonicity lemmas"
}
raw content_json (database row)
[{"type":"thinking","thinking":"Values confirmed:\n- marginTilde FAlt 80000 ≈ 15763.79 (vs FTru 16020.20 ✓ matches E-029's 16020 and my FAlt-slack estimate ~256)\n- margiñ′ FAlt(80000) ≈ 3.686\n\nSo the Lean goals:\n- `0 < marginTilde FAlt 80000` — margin ~15764. Strategy: prove `marginTilde FAlt 80000 > 10000` say, via:\n - LOWER bound sInftyLower(80000) ≥ 330000 (need lower bound on log 80000)\n - UPPER bound Bn FAlt 80000 ≤ 330000-ish... need margin slack: slower_low − Bn_up + 1 > 0. With true values 338072 − 322309 = 15763, I have room for ~15000 of sloppiness. Target: slower(80000) ≥ 337000 (needs log 80000 ≥ 11.283 true 11.2898 — err ~0.007·80000/2 = 280), Bn ≤ 337000/2... let me be careful: need slower_lo − Bn_hi + 1 > 0 with slower_lo ≥ 338072 − δ₁ and Bn_hi ≤ 322309 + δ₂, need δ₁ + δ₂ < 15764. Very generous.\n\nComponent bounds needed:\n- sInftyLower(80000) = (1/2)(80000) log 80000 + (C₁−γ/2)(80000) − 4.\n - log 80000: 80000 = 8·10⁴. log 80000 = log 8 + log 10⁴ = 3 log 2 + 4 log 10. Need log 10. Or: bound 80000 between powers of e? log 80000 ≥ 11.28 ⟺ 80000 ≥ e^11.28. e^11.28 = e^11 · e^0.28. e^11 = 59874.1; e^0.28 ≈ 1.3231 → 79203 ≤ 80000 ✓. In Lean: Real.exp 11.28 ≤ 80000 via... exp 11.28 = exp(11)·exp(0.28)... The file's pattern: Real.sum_le_exp_of_nonneg for lower bounds on exp. e^11.28 via partial sums is painful for x=11.28 (needs many terms). Alternative: log 80000 ≥ 11.28 via 80000 ≥ e^11.28. Hmm.\n \n Better approach: use log 2 bounds (Mathlib: Real.log_two_gt_d9 : 0.6931471803 < log 2; Real.log_two_lt_d9 : log 2 < 0.6931471808) and build log 80000 = 3 log 2 + 4 log 10 with log 10 = log 2 + log 5, log 5 = log 5... Mathlib has Real.log_five? No. But: log 5 = log(10/2) circular. log 10: no direct Mathlib d9. Derive: 10 = 2·5, log 5 = −log(1/5) = −log 0.2... hmm. log 5 = log(e^?)... Use: log 5 ≤ 1.61 ⟺ 5 ≤ e^1.61; e^1.61 ≥ 1 + 1.61 + 1.61²/2 + ... + 1.61⁷/7! — partial sum at 7 terms: 1+1.61+1.296+0.695+0.280+0.0902+0.0242+0.00557 = 5.001 ✓ (Real.sum_le_exp_of_nonneg with n=7). And log 5 ≥ 1.609 ⟺ e^1.609 ≤ 5: upper bound on exp — harder (exp partial sums are LOWER bounds for x ≥ 0). Upper bound on exp via exp x ≤ 1/(1−x+...) no... Standard trick: e^x ≤ 1/(Σ ...) no. For UPPER bound on log: log 5 ≤ 1.61 ⟸ 5 ≤ e^1.61 ⟸ partial sum ≤ e^1.61 — wait direction: sum_le_exp: Σ_{i<7} xⁱ/i! ≤ e^x for x ≥ 0. So partial sum 5.001 ≤ e^1.61 ⟹ 5 ≤ 5.001 ≤ e^1.61 ⟹ log 5 ≤ 1.61 ✓ (Real.log_le_log). For LOWER bound log 5 ≥ c: need e^c ≤ 5: upper-bound e^c. e^1.609: can't partial-sum upper bound directly. Trick: e^c ≤ 5 ⟸ e^c ≤ (something computable). Use e^c = 1/e^{−c}; e^{−c} ≥ partial sum of −c? For x < 0 the alternating series... sum_le_exp needs x ≥ 0.\n \n Alternative for lower bounds on log: Real.log_le_sub_one_of_pos gives log x ≤ x − 1 (UPPER bound on log). Lower bound on log: Real.one_sub_le_log? hmm: `Real.le_log_iff_exp_le`... There's `Real.log_le_sub_one_of_pos` (upper) and... for lower: log x ≥ (x−1)/x? That's log x = −log(1/x) ≥ −(1/x − 1) = 1 − 1/x. So log 5 ≥ 1 − 1/5 = 0.8 — too weak.\n \n Hmm. Better: use log 80000 directly with powers: 80000 = e^? ... Actually cleanest: bound log 80000 between RATIONAL bounds via e-power comparisons with INTEGER or simple-fraction exponents computed by repeated squaring of exp 1 bounds! We have Real.exp_one_lt_d9 (e < 2.7182818286) and Real.exp_one_gt_d9 (2.7182818283 < e)? Mathlib: Real.exp_one_lt_d9 : Real.exp 1 < 2.7182818286 and Real.exp_one_gt_d9 : 2.7182818283 < Real.exp 1. Then e^11 = (e^1)^11 — boundable by norm_num via pow! e^11 ≥ 2.7182818283^11 = 59874.13... and ≤ 2.7182818286^11 = 59874.20... Then e^11.28: 0.28 fractional — problem: rpow. Use e^{11.28} = e^11 · e^0.28; e^0.28 ≤ ? partial sums give LOWER bounds for e^0.28; upper bound on e^0.28 via e^0.28 = 1/e^{-0.28}... \n\n Simpler: avoid fractional exponents entirely. Choose the log bound grid at INTEGER exponents:\n - log 80000: e^11 ≤ 59874.2 < 80000 ⟹ log 80000 > 11. e^12 ≥ 59874·2.71828 ≥ 162750 > 80000 ⟹ log 80000 < 12. So 11 < log 80000 < 12 — gives slower ∈ [(0.5·80000·11 − 1.41894·80000 − 4), (0.5·80000·12 − ...)] = [440000 − 113515 − 4, ...] = [326481, 366485]. That's δ₁ = 11591 below true — eats most of the 15764 slack alone. Combined with Bn side it might JUST fail. Too coarse.\n \n Need finer: quarter-integer exponents? e^{0.25} = sqrt(sqrt(e))... Real.sqrt bounds... e^{11.25} = e^11 · e^{1/4}: e^{1/4} bounds via sqrt: e^{1/4} = sqrt(sqrt(e^1))... Real.exp (1/4) = sqrt(exp (1/8))? no — exp(1/4) = sqrt(exp(1/2)) = sqrt(sqrt(exp 1)). exp(1/2) = sqrt(exp 1)? Real.exp_half? There IS Real.exp_half? Hmm: Real.exp_mul... exp(2·(1/4)) = exp(1/2): (exp(1/4))² = exp(1/2) via ← Real.exp_add. So exp(1/4) = sqrt(exp(1/2)) with nonneg. This is getting deep.\n\n ALTERNATIVE STRATEGY — much better: bound log at 80000 via log 80000 = log 8 + log 10000 = 3 log 2 + 8 log 10^{1/2}... no. log 10000 = log(10⁴) = 4 log 10. log 10 = log 2 + log 5. So need log 5 bounds. log 5: 5 = e^1·(5/e) — log 5 = 1 + log(5/e). 5/e ∈ [5/2.7183, 5/2.7182] = [1.8389, 1.8390]. log(1.839): 1.839 = ? Use log_le_sub_one_of_pos: log x ≤ x−1 = 0.839 (too weak). Hmm.\n\n log 5 via 5 = 4·(5/4): log 5 = 2 log 2 + log(5/4). log(5/4): upper: log(5/4) ≤ 1/4 (log_le_sub_one). Lower: log(5/4) = −log(4/5) ≥ −(4/5 − 1) = 1/5. So log(5/4) ∈ [0.2, 0.25]. log 5 ∈ [2·0.6931471 + 0.2, 2·0.6931472 + 0.25] = [1.5862942, 1.6362944]. Width 0.05 — too coarse for the 4 log 10 term (×4·80000·0.5... log 80000 = 3 log 2 + 4(log 2 + log 5) = 7 log 2 + 4 log 5: error 4·0.05 = 0.2 → slower error 0.5·80000·0.2 = 8000. Hmm borderline.\n\n Refine log(5/4) via the alternating series for log(1+x): log(1.25) = Σ (−1)^{k+1} x^k/k, x = 0.25. Alternating with decreasing terms: truncate: 0.25 − 0.03125 + 0.0052083 − 0.0009766 + 0.0001953 = 0.223426… next term −0.0000407. So log(5/4) ∈ [0.22339, 0.22347] with 6 terms. In Lean: alternating series bounds — provable via... this is Real.log 1.25 — is there a Mathlib lemma? There's `Real.log_one_add_le`? The cleanest in-Lean technique for tight log bounds at specific points: use Real.log_div + known d9 constants... \n\n ALTERNATIVELY — completely different tactic: log 80000 = log(8) + log(10⁴) needs log 10. What about: log(80000) = log(65536 · 1.2207) = 16 log 2 + log(1.2207). 65536 = 2^16! 80000/65536 = 1.220703. log(1.220703): alternating series x = 0.220703: terms decrease (x < 1): log(1.2207) ≈ 0.19931. Bounds via alternating series: provable in Lean via Real.log_le_sub_one... no, need a SERIES bound. Mathlib: Real.log_one_add_...? There's `Real.log_le_sub_one_of_pos`, and lower bound `Real.one_sub_inv_le_log_of_pos`? Something like 1 − 1/x ≤ log x? Real.one_sub_inv_le_log? If exists: 1 − 1/x ≤ log x ≤ x − 1 — at x = 1.2207: [0.1809, 0.2207] — too coarse.\n\n Better Lean-native approach: rpow-based comparison. log 80000 ≥ c ⟺ 80000 ≥ exp(c). For c = 11.2898: exp(11.2898) = exp(11)·exp(0.2898). exp(0.2898) upper bound: exp(0.2898) ≤ 1/(1 − 0.2898 + 0.2898²/2 − ...) hmm alternating again.\n\n You know what — Mathlib HAS tight bounds for log 2 only (d9). But there's ALSO `Real.log_two_gt_d9` and possibly bounds for log of other small integers in recent Mathlib? Let me grep: Real.log_three, log_five... I don't think so.\n\n PRAGMATIC CHOICE: the cleanest high-precision primitive available is `Real.sum_le_exp_of_nonneg` (lower bound on exp via partial sums) for proving log x ≤ c (via x ≤ partial_sum ≤ exp c — wait no: log x ≤ c ⟺ x ≤ exp c; partial sums give LOWER bounds on exp c, i.e. p ≤ exp c. If x ≤ p then x ≤ exp c ✓ so log x ≤ c. YES: log x ≤ c is provable by exhibiting a partial sum p with x ≤ p ≤ exp c! \n And log x ≥ c ⟺ x ≥ exp c: need UPPER bound on exp c. For c > 0: exp c = 1/exp(−c)... exp(−c) for c > 0: −c < 0, partial sums alternate... no direct.\n exp c upper via exp c ≤ (something)^(k) trick: exp c = (exp(c/m))^m and exp(c/m) ≤ 1/(1 − c/m − ...)... \n\n Hmm OK here's the cleanest upper-bound-on-exp trick: for 0 ≤ x < 1... we have exp(−x) ≥ 1 − x (Real.one_sub_le_exp? hmm — actually exp(−x) ≥ 1 − x is Bernoulli-ish: exp(−x) ≥ 1 + (−x) = 1 − x from Real.add_one_le_exp? `Real.add_one_le_exp : x + 1 ≤ Real.exp x` for all real x ✓ (I think exists). Then exp(x) = 1/exp(−x) ≤ 1/(1−x) for x < 1. So exp x ≤ 1/(1−x) — crude. Better: exp(x) = (exp(x/k))^k ≤ 1/(1−x/k)^k for x < k. With k = 8, x = 0.29: 1/(1−0.03625)^8 = 1/0.96375^8 = 1/0.7442 = 1.3438 (true e^0.29 = 1.3364). Good enough (0.5% error).\n\n This is all doable but LONG. Let me think about the total structure of the base-point proof:\n\n marginTilde FAlt 80000 = slower(80000) − Bn(80000) + 1 > 0.\n \n slower(80000) = (1/2)(80000)(log 80000) + (C₁−γ/2)(80000) − 4 where C₁−γ/2 = (γ−1−log 2π)/2 − γ/2 = −1/2 − (log 2π)/2 − γ/2·... let me just say it's a specific constant ≈ −1.41894. So slower = 40000·log 80000 − 1.41894·80000 − 4 = 40000·log 80000 − 113519.2.\n \n Need: LOWER bound log 80000 ≥ L1, and (C₁−γ/2) = exact expression: the constant involves γ (eulerMascheroniConstant) and log 2π. C₁−γ/2 = (γ − 1 − log 2π)/2 − γ/2 = −(1 + log 2π)/2 = −(1 + log 2 + log π)/2. The γ CANCELS! Nice: (γ − 1 − log 2π)/2 − γ/2 = γ/2 − (1+log 2π)/2 − γ/2 = −(1 + log 2 + log π)/2. So slower(n) = (1/2)n log n − ((1 + log 2 + log π)/2)·n − 4. The γ-free form! In Lean, when I unfold lagariasC1, I get eulerMascheroniConstant terms that cancel by ring — the γ is a variable-like opaque term, ring handles the cancellation ✓.\n \n So slower(80000) = 40000·log 80000 − (1 + log 2 + log π)/2·80000 − 4.\n \n Bn side (upper bounds): T = √80000 + 1 ≤ 284 (since √80000 ≤ 283 ⟸ 80000 ≤ 283² = 80089 ✓... wait need √80000 ≤ 283 ⟺ 80000 ≤ 283² ✓ 80089). Actually T ≤ 284. Components:\n - 2 FAlt(T): T·log T term: T ≤ 284, log T ≤ log 284 ≤ ? 284 ≤ e^{5.65}? e^5.65 = e^5·e^0.65: e^5 ≤ 2.7183^5 = 148.42; e^0.65 ≤ 1/(1−0.65/8)^8 = 1/(0.91875)^8 = 1/0.5067 = 1.9735. → 292.9 ≥ 284 ✓ so log 284 ≤ 5.65. Hmm: 148.42·1.9735 = 292.9 ✓. So log T ≤ 5.65 (T ≤ 284 ≤ 292.9 ≤ e^5.65... wait need 284 ≤ e^5.65: 292.9 ≤ e^5.65? NO: 292.9 is my UPPER bound on e^5.65... I need e^5.65 ≥ 284: need LOWER bound on e^5.65: e^5 ≥ 2.7182^5 = 148.32 (norm_num pow of exp_one_gt_d9); e^0.65 ≥ 1 + 0.65 + 0.65²/2 + ... partial sum (Real.sum_le_exp_of_nonneg): Σ_{i<6} 0.65^i/i! = 1 + 0.65 + 0.21125 + 0.04577 + 0.00744 + 0.000967 = 1.9154. e^5.65 ≥ 148.32·1.9154 = 284.09 ≥ 284 ✓ JUST barely (0.03% margin — tight! use more terms: 7 terms: +0.65^6/720 = 0.0001046 → 1.9155; 148.32·1.9155 = 284.10. Tight but OK. Or use 5.66: e^5.66 ≥ 148.32·(partial sum at 0.66) = 1 + .66 + .2178 + .047916 + .007906 + .0010436 + .0001148 = 1.9348 → 148.32·1.9348 = 286.97 ≥ 284 ✓ comfortable.) So log T ≤ 5.66 via T ≤ 284 ≤ 286.9 ≤ e^5.66.\n \n Actually WAIT. Simplification opportunity: since the margin slack is ~15764 and the pieces are computable to within a few units with crude bounds, I could instead prove the STRONGER but simpler statement via very crude bounds with a computer-verified margin. The pieces:\n - slower(80000) ≥ 337000: ⟸ 40000·log 80000 − 40000·(1+log 2+log π)·... let me compute (1+log2+logπ)/2 = (1+0.6931+1.1447)/2 = 1.4189. slower = 40000·(log 80000 − 1.4189·2) − 4 = 40000·(log 80000) − 113515 − 4. Need ≥ 337000 ⟺ log 80000 ≥ (337000 + 113519)/40000 = 11.2630. True 11.2898 — margin 0.0268. log 80000 ≥ 11.263 ⟺ 80000 ≥ e^11.263: e^11.263 = e^11·e^0.263: e^11 ≤ 59874.2 (upper); — NO I need e^11.263 ≤ 80000: e^11.263 = e^11 · e^0.263 ≤ [upper e^11]·[upper e^0.263]. Upper e^11 = 2.7182818286^11 — norm_num computes 2.7182818286^11 ≈ 59874.3. Upper e^0.263 = 1/(1−0.263/8)^8 trick: 1/(0.96713)^8 = 1/0.7648 = 1.3075. e^11.263 ≤ 59874.3·1.3075 = 78286 ≤ 80000 ✓ (2.2% margin). So log 80000 ≥ 11.263 provable.\n \n Hmm, but each such bound is a small lemma with Real.sum_le_exp_of_nonneg + pow bounds + Real.log_le_log... Total base-point proof ≈ 300–500 lines of this grind. It's mechanical but long. And the DERIVATIVE base point is worse: deriv (marginTilde FAlt) 80000 — need the explicit deriv expression = deriv of marginExpanded pieces: S′ = (1/2)(log n + 1) + (C₁−γ/2); F-block: −2·F′(T)/(2√n) = −F′(T)/√n; each 4T·g(T) block: derivative = [4g(T) + 4T g′(T)]/(2√n)... all computable but MANY pieces, each needing deriv lemmas + numeric bounds. Probably another 400+ lines.\n\n Time check: this is getting long for the remainder of the session. Per sub-stage rule + break prompt: the notes' step-1 deliverable (assembly modulo SfBound) is DONE and committed. The hbase/hbase′ discharge is \"step 2\" — mechanical numeric grind. The session-012-notes said step 1 is \"achievable in a few sessions\" and we did it in one — good. \n\n Decision: do 12.2 partially or defer? Let me assess effort for hbase (margin > 0): ~2-3 hours of Lean grind maybe. hbase′ (deriv > 0): similar or more. Alternatively — a SMARTER approach for hbase′: deriv (marginTilde FAlt) 80000 > 0. We have marginTilde_convex : ConvexOn ... — convexity alone doesn't give the base derivative. Hmm.\n\n Actually — WAIT. There's a much cheaper route to discharge hbase′ (derivative positivity) that avoids ALL numeric evaluation of the derivative: pos_of_convex_of_base uses h0' : 0 < deriv f N₀. Alternative formulation: convexity + positivity at TWO points? If f is convex on [20,∞) and 0 < f(N₀) and f(N₀) < f(N₁) for some N₁ > N₀... then for x ≥ N₁: slope argument gives f(x) ≥ f(N₁) + slope·(x−N₁) where slope = (f(N₁)−f(N₀))/(N₁−N₀) > 0 — by ConvexOn.slope_le or similar (secant slopes increase). That trades the derivative evaluation for a SECOND function evaluation (f at N₁ = e.g. 100000) — much cheaper (no deriv machinery, just another numeric eval of the same kind as hbase, and margin(100000) = 9.3×10⁴ ≫ margin(80000) = 1.6×10⁴ — hugely separated, easy bounds).\n \n ConvexOn.secant: `ConvexOn.slope_le_of...`? The three-chord lemma: for x < y < z in the domain, slope f x y ≤ slope f y z. Mathlib: `ConvexOn.slope_le`? Hmm — there's `ConvexOn.slope_mono`? Let me think of the exact statement needed: for N₀ < N₁ ≤ x: (f(N₁) − f(N₀))/(N₁ − N₀) ≤ (f(x) − f(N₁))/(x − N₁). Then f(x) ≥ f(N₁) + s·(x−N₁) ≥ f(N₁) > 0. The three-chord: ConvexOn.slope_le_adjacent? Search Mathlib for secant: `ConvexOn.secant_mono`? I recall `ConvexOn.slope_mono`... In Convex/Basic or Function.lean: `theorem ConvexOn.slope_le_of...`? There's `ConvexOn.smul_slope...`? Let me grep later. If exists, this avoids the derivative entirely for the main theorem — but the ASSEMBLY's current shape uses pos_of_convex_of_base with h0'. I can prove a variant pos_of_convex_of_two_bases using the secant lemma, and switch the assembly to it. Then discharge = two numeric evals (same machinery twice).\n \n Even better: keep BOTH variants in the file (pos_of_convex_of_base is already proved — keep it as a lemma), add pos_of_convex_of_two_points, and change the main theorem's hypotheses to (hbase : 0 < marginTilde FAlt 80000) (hbase2 : marginTilde FAlt 80000 < marginTilde FAlt 100000). Then discharge both numerically — hbase2 ⟸ margin(80000) ≤ 16000 < 90000 ≤ margin(100000) — generous.\n\n Hmm, but is this BETTER than just evaluating the derivative? The derivative evaluation needs: deriv (marginTilde FAlt) 80000 in closed form. We have all pieces: hasDerivAt_marginS (S′), chain-rule first derivs... but I DON'T have a first-derivative lemma for the full marginExpanded — I'd have to build deriv of each of the 12 blocks at n = 80000 (vF-style first-derivatives — the machinery exists inside chain_rule_sqrt_shift_on's hg1 but not standalone). That's real work. The two-point variant needs ZERO new derivative machinery — just a secant lemma + the same numeric evaluation at a second point. CLEARLY cheaper. Go with two-point.\n\n Mathlib secant lemma: `ConvexOn.slope_le_of_le`? Let me search for the right name. I recall: `ConvexOn.slope_mono`? or `ConvexOn.secant_mono`... In Mathlib/Analysis/Convex/Slope.lean: theorems like `ConvexOn.slope_mono`... let me grep.\n\nAlso for hbase: is there an even cheaper trick? margin(80000) > 0 needs ONE numeric evaluation — unavoidable (it's the actual content). OK.\n\nSo 12.2 revised plan:\n1. pos_of_convex_of_two_points lemma (secant slope).\n2. Rewrite assembly: hypotheses (hbase : 0 < marginTilde FAlt 80000) (hbase2 : marginTilde FAlt 80000 < marginTilde FAlt 100000).\n3. Numeric discharge: margin_lower_bound lemmas:\n - `marginTilde_FAlt_80000_pos : 0 < marginTilde FAlt 80000` via slower ≥ X, Bn ≤ Y.\n - `marginTilde_FAlt_100000_lower : marginTilde FAlt 100000 > marginTilde FAlt 80000` via margin(100000) ≥ 90000-ish and margin(80000) ≤ 16000-ish — need BOTH-sided bounds (upper on margin(80000): slower(80000) ≤ ... and Bn ≥ ...). Two-sided numeric work at both points. That's 4 bounding computations. Each is the same kind of log/exp/sqrt rational grind.\n\nTotal: significant but tractable. This is the grind the notes anticipated (\"a few sessions\"). Given how much time the assembly took, let me pace: the notes say NO RUSH. The break-prompt rule: approaching 5 PM ask user. I don't know the current time... The session has been going a while. The milestone is committed. Let me continue with the secant variant + numeric grind, but STRUCTURE it so partial progress commits cleanly.\n\nActually — let me reconsider scope. What remains for the FULL notes step-1 deliverable? The notes say: \"state lambda_pos_finite_height with SfBound named hypothesis, discharge the full assembly conditional on it. ... That's honest, precise, and achievable in a few sessions.\" The base points weren't explicitly mentioned in the notes — they're part of \"the full assembly\". The current committed state HAS the assembly conditional on SfBound + 2 elementary numeric facts. The honest paper claim is already upgraded: \"verified modulo one named analytic hypothesis + the computational perimeter + two elementary numeric evaluations (E-028/E-029-verified values)\".\n\n12.2 (numeric discharge) is genuinely valuable but mechanical; 12.3 (triage doc D-062) is the notes' step-2 design work (\"decide deliberately where the perimeter goes\") — arguably the more important intellectual content, and the notes explicitly want the triage DECISION.\n\nPlan: do the secant variant (cheap, removes the derivative hypothesis — improves the interim state), then write D-062 triage + journal/STATE/db updates + commit, and LEAVE the numeric discharge (hbase/hbase2) as an explicitly-scoped next-session task with the bounds pre-computed (I have the values: need log 80000 ≥ 11.263 etc.). Actually — hmm, if I'm doing the secant variant I should at least ALSO attempt the numeric discharge since it's the same session's theme. Let me first check the secant lemma name, then decide based on remaining budget. Let me also quickly reconsider: maybe just do the numeric discharge NOW with the derivative version... no — secant is strictly cheaper.\n\nLet me grep for the secant/slope lemma.","signature":""},{"type":"text","text":"Base values confirmed: margin(FAlt) = 15763.79 at 80 000, deriv ≈ 3.686. \n\nDesign improvement before grinding numerics: replace the derivative base point with a **second evaluation point** — convexity + `f(80 000) > 0` + `f(80 000) < f(100 000)` gives tail positivity by the secant-slope lemma, avoiding all derivative-evaluation machinery (margin(10⁵) ≈ 9.3×10⁴, hugely separated). Checking the Mathlib secant lemma name."},{"type":"tool_use","id":"Bash_79","name":"Bash","input":{"command":"grep -rn \"theorem ConvexOn.slope\\|lemma ConvexOn.slope\" D:/Python/Quantum/zeta-23-lean/.lake/packages/mathlib/Mathlib/Analysis/Convex/Slope.lean | head -12","description":"Find secant slope monotonicity lemmas"},"extra_content":null}]