Current task: —

← Session 17 — Lean tier (i): elementary proofs (after crash)

#650 assistant 2026-08-20 05:01:42.384 UTC · 471→3499 tok open ⤢
thinking (2515 chars)
API confirmed: - `ContDiffOn.deriv_of_isOpen (hf : ContDiffOn 𝕜 n f s) (hs : IsOpen s) (hmn : m + 1 ≤ n) : ContDiffOn 𝕜 m (deriv f) s` ✓ - `ContDiffOn.differentiableOn (h : ContDiffOn 𝕜 n f s) (hn : n ≠ 0) : DifferentiableOn 𝕜 f s` ✓ - `DifferentiableOn.differentiableAt : DifferentiableOn ℝ f s → s ∈ 𝓝 x → DifferentiableAt ℝ f x` ✓ (standard). - `isOpen_Ioi : IsOpen (Set.Ioi a)` ✓. Now write S1: `chain_rule_sqrt_shift_on` (local version on Ioi (−1)) and `chain_rule_sqrt` (global, T = √n, no shift). Model on the existing chain_rule_sqrt_shift proof. For chain_rule_sqrt_shift_on, mirror the existing proof with these adaptations: - hφ1 : DifferentiableAt ℝ φ (√m+1) for m > 0: from hφ.differentiableOn (by norm_num : (2:ℕ) ≠ 0)... wait hn : n ≠ 0 for ENat? ContDiffOn ℝ 2 — the 2 is ℕ cast to ENat; hn : (2:ℕ∞)... the lemma: `ContDiffOn.differentiableOn (h : ContDiffOn 𝕜 n f s) (hn : n ≠ 0)`. Provide (by norm_num : (2:ℕ∞) ≠ 0)? Or `by decide`? For n = 2 as ℕ∞: `(2 : ℕ∞) ≠ 0` — `by norm_num` or `by simp`. Hmm the existing proof used hφ.differentiable (by norm_num) for ContDiff ℝ 2 — ContDiff.differentiable (hn : n ≠ 0)? It worked with norm_num there ✓ same here. - Then DifferentiableOn ℝ φ (Ioi (−1)); at point √m+1 (m > 0): membership: √m+1 > 1 > −1 ✓; neighborhood: Ioi(−1) ∈ 𝓝 (√m+1) via Ioi_mem_nhds ✓ then differentiableAt. - hφ2 : DifferentiableAt ℝ (deriv φ) (√n+1): from (hφ.deriv_of_isOpen isOpen_Ioi (by norm_num : (1:ℕ)+1 ≤ (2:ℕ∞))... hmm hmn : m+1 ≤ n with m := 1, n := 2: (1:ℕ∞)+1 ≤ 2 ✓ norm_num/decide). Then ContDiffOn ℝ 1 (deriv φ) (Ioi (−1)) → .differentiableOn (by norm_num : (1:ℕ∞)≠0) → differentiableAt (nbhd) ✓. Rest identical. For the eventual neighborhood: existing proof uses hpos : Set.Ioi 0 ∈ 𝓝 n and proves hg1 for m ∈ Ioi 0 — need hφ1 (√m+1) there ✓ works. Also for chain_rule_sqrt (T = √n): copy chain_rule_sqrt_shift with T := √n: the identity: deriv(deriv (φ∘√)) n = (φ″(√n) − φ′(√n)/√n)/(4n) — same form as shift version with √n instead of... wait the shift version: (φ″(T) − φ′(T)/√n)/(4n) where T = √n+1 — the division is by √n = T−1 ✓ same formula with T = √n: (φ″(√n) − φ′(√n)/√n)/(4n) ✓. The proof: drop the +1 (differentiableAt of √ alone instead of √·+1). Actually — can I just APPLY chain_rule_sqrt_shift_on to ψ with... no, the shift matters. Write it directly (it's a short adaptation). For IIMaj, ψ̃ is globally ContDiff — so chain_rule_sqrt with (hψ : ContDiff ℝ 2 ψ) global — even simpler (mirror of the original global proof). Write S1 now. Then build.
API confirmed. Writing S1: the two chain-rule infrastructure lemmas.
tool: Edit
input
{
  "file_path": "D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean",
  "old_string": "/-- [PROVED session 011] The D-057 chain-rule identity behind the\n11-block reduction: with T(n) = \u221an + 1,\nd\u00b2/dn\u00b2 \u03c6(T(n)) = [\u03c6\u2033(T) \u2212 \u03c6\u2032(T)/(T\u22121)] / (4n), written with\n\u221an = T\u22121. (Warm-up proof; first sorry eliminated from the library.) -/\ntheorem chain_rule_sqrt_shift (\u03c6 : \u211d \u2192 \u211d) (h\u03c6 : ContDiff \u211d 2 \u03c6)\n    (n : \u211d) (hn : 0 < n) :\n    deriv (deriv fun n => \u03c6 (Real.sqrt n + 1)) n =\n      (deriv (deriv \u03c6) (Real.sqrt n + 1) -\n        deriv \u03c6 (Real.sqrt n + 1) / Real.sqrt n) / (4 * n) := by",
  "new_string": "/-- [PROVED session 011] Localized variant of `chain_rule_sqrt_shift`:\n\u03c6 only needs to be C\u00b2 on (\u22121, \u221e) (all D-057 blocks: L1-singularities at\nT = \u22122, L2-singularities at T = \u22121). -/\ntheorem chain_rule_sqrt_shift_on (\u03c6 : \u211d \u2192 \u211d)\n    (h\u03c6 : ContDiffOn \u211d 2 \u03c6 (Set.Ioi (-1))) (n : \u211d) (hn : 0 < n) :\n    deriv (deriv fun n => \u03c6 (Real.sqrt n + 1)) n =\n      (deriv (deriv \u03c6) (Real.sqrt n + 1) -\n        deriv \u03c6 (Real.sqrt n + 1) / Real.sqrt n) / (4 * n) := by\n  have h\u03c6d : DifferentiableOn \u211d \u03c6 (Set.Ioi (-1)) :=\n    h\u03c6.differentiableOn (by norm_num)\n  have h\u03c6dd : DifferentiableOn \u211d (deriv \u03c6) (Set.Ioi (-1)) :=\n    (h\u03c6.deriv_of_isOpen isOpen_Ioi (by norm_num)).differentiableOn (by norm_num)\n  have hmem : \u2200 m : \u211d, 0 < m \u2192 Set.Ioi (-1) \u2208 \ud835\udcdd (Real.sqrt m + 1) := by\n    intro m hm\n    exact Ioi_mem_nhds (by linarith [Real.sqrt_nonneg m])\n  have h\u03c61 : \u2200 m : \u211d, 0 < m \u2192 DifferentiableAt \u211d \u03c6 (Real.sqrt m + 1) :=\n    fun m hm => h\u03c6d.differentiableAt (hmem m hm)\n  have h\u03c62 : DifferentiableAt \u211d (deriv \u03c6) (Real.sqrt n + 1) :=\n    h\u03c6dd.differentiableAt (hmem n hn)\n  have hsqrt : HasDerivAt Real.sqrt (1 / (2 * Real.sqrt n)) n :=\n    Real.hasDerivAt_sqrt hn.ne'\n  have hdiff_sqrt : DifferentiableAt \u211d Real.sqrt n := hsqrt.differentiableAt\n  have hdiff_h : DifferentiableAt \u211d (fun n => Real.sqrt n + 1) n :=\n    hdiff_sqrt.add (differentiableAt_const 1)\n  have hpos : Set.Ioi (0 : \u211d) \u2208 \ud835\udcdd n := Ioi_mem_nhds hn\n  have hg1 : deriv (fun n => \u03c6 (Real.sqrt n + 1)) =\u1da0[\ud835\udcdd n]\n      fun n => deriv \u03c6 (Real.sqrt n + 1) * (2 * Real.sqrt n)\u207b\u00b9 := by\n    filter_upwards [hpos] with m hm\n    have hsm : HasDerivAt Real.sqrt (1 / (2 * Real.sqrt m)) m :=\n      Real.hasDerivAt_sqrt (ne_of_gt hm)\n    have hhm : DifferentiableAt \u211d (fun x => Real.sqrt x + 1) m :=\n      hsm.differentiableAt.add (differentiableAt_const 1)\n    have h1 : deriv (fun x => Real.sqrt x + 1) m = 1 / (2 * Real.sqrt m) := by\n      rw [deriv_add_const]\n      exact hsm.deriv\n    rw [show (fun x => \u03c6 (Real.sqrt x + 1)) = \u03c6 \u2218 (fun x => Real.sqrt x + 1)\n        from rfl,\n      deriv_comp m (h\u03c61 m hm) hhm, h1]\n    ring\n  have hA : HasDerivAt (fun n => deriv \u03c6 (Real.sqrt n + 1))\n      (deriv (deriv \u03c6) (Real.sqrt n + 1) * (1 / (2 * Real.sqrt n))) n := by\n    have h1 : HasDerivAt (fun x => Real.sqrt x + 1) (1 / (2 * Real.sqrt n)) n :=\n      hsqrt.add_const 1\n    have h2 : HasDerivAt (deriv \u03c6) (deriv (deriv \u03c6) (Real.sqrt n + 1))\n        (Real.sqrt n + 1) :=\n      h\u03c62.hasDerivAt\n    have h3 := h2.comp n h1\n    rwa [show (fun n => deriv \u03c6 (Real.sqrt n + 1)) =\n      deriv \u03c6 \u2218 (fun n => Real.sqrt n + 1) from rfl]\n  have hB : HasDerivAt (fun n => (2 * Real.sqrt n)\u207b\u00b9)\n      (-(2 * (1 / (2 * Real.sqrt n))) / (2 * Real.sqrt n) ^ 2) n := by\n    have h1 : HasDerivAt (fun n => 2 * Real.sqrt n) (2 * (1 / (2 * Real.sqrt n))) n :=\n      hsqrt.const_mul 2\n    have h2 : (2 * Real.sqrt n) \u2260 0 :=\n      mul_ne_zero two_ne_zero (Real.sqrt_ne_zero'.2 hn)\n    exact h1.inv h2\n  have hmul : HasDerivAt (fun n => deriv \u03c6 (Real.sqrt n + 1) * (2 * Real.sqrt n)\u207b\u00b9)\n      (deriv (deriv \u03c6) (Real.sqrt n + 1) * (1 / (2 * Real.sqrt n)) * (2 * Real.sqrt n)\u207b\u00b9 +\n        deriv \u03c6 (Real.sqrt n + 1) *\n          (-(2 * (1 / (2 * Real.sqrt n))) / (2 * Real.sqrt n) ^ 2)) n :=\n    hA.mul hB\n  have hder := (hmul.congr_of_eventuallyEq hg1).deriv\n  rw [hder]\n  set s := Real.sqrt n with hsdef\n  have hs0 : s \u2260 0 := Real.sqrt_ne_zero'.2 hn\n  have hn_eq : n = s ^ 2 := by\n    rw [hsdef]; exact (Real.sq_sqrt hn.le).symm\n  rw [hn_eq]\n  field_simp [hs0]\n  ring\n\n/-- [PROVED session 011] Chain-rule identity with T(n) = \u221an (no shift),\nfor the IIMaj term: d\u00b2/dn\u00b2 \u03c8(\u221an) = [\u03c8\u2033(\u221an) \u2212 \u03c8\u2032(\u221an)/\u221an] / (4n). -/\ntheorem chain_rule_sqrt (\u03c8 : \u211d \u2192 \u211d) (h\u03c8 : ContDiff \u211d 2 \u03c8)\n    (n : \u211d) (hn : 0 < n) :\n    deriv (deriv fun n => \u03c8 (Real.sqrt n)) n =\n      (deriv (deriv \u03c8) (Real.sqrt n) -\n        deriv \u03c8 (Real.sqrt n) / Real.sqrt n) / (4 * n) := by\n  have h\u03c81 : Differentiable \u211d \u03c8 := h\u03c8.differentiable (by norm_num)\n  have h\u03c82 : Differentiable \u211d (deriv \u03c8) :=\n    (h\u03c8.deriv' (n := 1)).differentiable one_ne_zero\n  have hsqrt : HasDerivAt Real.sqrt (1 / (2 * Real.sqrt n)) n :=\n    Real.hasDerivAt_sqrt hn.ne'\n  have hpos : Set.Ioi (0 : \u211d) \u2208 \ud835\udcdd n := Ioi_mem_nhds hn\n  have hg1 : deriv (fun n => \u03c8 (Real.sqrt n)) =\u1da0[\ud835\udcdd n]\n      fun n => deriv \u03c8 (Real.sqrt n) * (2 * Real.sqrt n)\u207b\u00b9 := by\n    filter_upwards [hpos] with m hm\n    have hsm : HasDerivAt Real.sqrt (1 / (2 * Real.sqrt m)) m :=\n      Real.hasDerivAt_sqrt (ne_of_gt hm)\n    rw [show (fun x => \u03c8 (Real.sqrt x)) = \u03c8 \u2218 Real.sqrt from rfl,\n      deriv_comp m (h\u03c81 (Real.sqrt m)) hsm.differentiableAt, hsm.deriv]\n    ring\n  have hA : HasDerivAt (fun n => deriv \u03c8 (Real.sqrt n))\n      (deriv (deriv \u03c8) (Real.sqrt n) * (1 / (2 * Real.sqrt n))) n := by\n    have h2 : HasDerivAt (deriv \u03c8) (deriv (deriv \u03c8) (Real.sqrt n))\n        (Real.sqrt n) :=\n      (h\u03c82 (Real.sqrt n)).hasDerivAt\n    have h3 := h2.comp n hsqrt\n    rwa [show (fun n => deriv \u03c8 (Real.sqrt n)) = deriv \u03c8 \u2218 Real.sqrt from rfl]\n  have hB : HasDerivAt (fun n => (2 * Real.sqrt n)\u207b\u00b9)\n      (-(2 * (1 / (2 * Real.sqrt n))) / (2 * Real.sqrt n) ^ 2) n := by\n    have h1 : HasDerivAt (fun n => 2 * Real.sqrt n) (2 * (1 / (2 * Real.sqrt n))) n :=\n      hsqrt.const_mul 2\n    have h2 : (2 * Real.sqrt n) \u2260 0 :=\n      mul_ne_zero two_ne_zero (Real.sqrt_ne_zero'.2 hn)\n    exact h1.inv h2\n  have hmul : HasDerivAt (fun n => deriv \u03c8 (Real.sqrt n) * (2 * Real.sqrt n)\u207b\u00b9)\n      (deriv (deriv \u03c8) (Real.sqrt n) * (1 / (2 * Real.sqrt n)) * (2 * Real.sqrt n)\u207b\u00b9 +\n        deriv \u03c8 (Real.sqrt n) *\n          (-(2 * (1 / (2 * Real.sqrt n))) / (2 * Real.sqrt n) ^ 2)) n :=\n    hA.mul hB\n  have hder := (hmul.congr_of_eventuallyEq hg1).deriv\n  rw [hder]\n  set s := Real.sqrt n with hsdef\n  have hs0 : s \u2260 0 := Real.sqrt_ne_zero'.2 hn\n  have hn_eq : n = s ^ 2 := by\n    rw [hsdef]; exact (Real.sq_sqrt hn.le).symm\n  rw [hn_eq]\n  field_simp [hs0]\n  ring\n\n/-- [PROVED session 011] The D-057 chain-rule identity behind the\n11-block reduction: with T(n) = \u221an + 1,\nd\u00b2/dn\u00b2 \u03c6(T(n)) = [\u03c6\u2033(T) \u2212 \u03c6\u2032(T)/(T\u22121)] / (4n), written with\n\u221an = T\u22121. (Warm-up proof; first sorry eliminated from the library.) -/\ntheorem chain_rule_sqrt_shift (\u03c6 : \u211d \u2192 \u211d) (h\u03c6 : ContDiff \u211d 2 \u03c6)\n    (n : \u211d) (hn : 0 < n) :\n    deriv (deriv fun n => \u03c6 (Real.sqrt n + 1)) n =\n      (deriv (deriv \u03c6) (Real.sqrt n + 1) -\n        deriv \u03c6 (Real.sqrt n + 1) / Real.sqrt n) / (4 * n) := by"
}
raw content_json (database row)
[{"type":"thinking","thinking":"API confirmed:\n- `ContDiffOn.deriv_of_isOpen (hf : ContDiffOn 𝕜 n f s) (hs : IsOpen s) (hmn : m + 1 ≤ n) : ContDiffOn 𝕜 m (deriv f) s` ✓\n- `ContDiffOn.differentiableOn (h : ContDiffOn 𝕜 n f s) (hn : n ≠ 0) : DifferentiableOn 𝕜 f s` ✓\n- `DifferentiableOn.differentiableAt : DifferentiableOn ℝ f s → s ∈ 𝓝 x → DifferentiableAt ℝ f x` ✓ (standard).\n- `isOpen_Ioi : IsOpen (Set.Ioi a)` ✓.\n\nNow write S1: `chain_rule_sqrt_shift_on` (local version on Ioi (−1)) and `chain_rule_sqrt` (global, T = √n, no shift). Model on the existing chain_rule_sqrt_shift proof.\n\nFor chain_rule_sqrt_shift_on, mirror the existing proof with these adaptations:\n- hφ1 : DifferentiableAt ℝ φ (√m+1) for m > 0: from hφ.differentiableOn (by norm_num : (2:ℕ) ≠ 0)... wait hn : n ≠ 0 for ENat? ContDiffOn ℝ 2 — the 2 is ℕ cast to ENat; hn : (2:ℕ∞)... the lemma: `ContDiffOn.differentiableOn (h : ContDiffOn 𝕜 n f s) (hn : n ≠ 0)`. Provide (by norm_num : (2:ℕ∞) ≠ 0)? Or `by decide`? For n = 2 as ℕ∞: `(2 : ℕ∞) ≠ 0` — `by norm_num` or `by simp`. Hmm the existing proof used hφ.differentiable (by norm_num) for ContDiff ℝ 2 — ContDiff.differentiable (hn : n ≠ 0)? It worked with norm_num there ✓ same here.\n- Then DifferentiableOn ℝ φ (Ioi (−1)); at point √m+1 (m > 0): membership: √m+1 > 1 > −1 ✓; neighborhood: Ioi(−1) ∈ 𝓝 (√m+1) via Ioi_mem_nhds ✓ then differentiableAt.\n- hφ2 : DifferentiableAt ℝ (deriv φ) (√n+1): from (hφ.deriv_of_isOpen isOpen_Ioi (by norm_num : (1:ℕ)+1 ≤ (2:ℕ∞))... hmm hmn : m+1 ≤ n with m := 1, n := 2: (1:ℕ∞)+1 ≤ 2 ✓ norm_num/decide). Then ContDiffOn ℝ 1 (deriv φ) (Ioi (−1)) → .differentiableOn (by norm_num : (1:ℕ∞)≠0) → differentiableAt (nbhd) ✓.\n\nRest identical. For the eventual neighborhood: existing proof uses hpos : Set.Ioi 0 ∈ 𝓝 n and proves hg1 for m ∈ Ioi 0 — need hφ1 (√m+1) there ✓ works.\n\nAlso for chain_rule_sqrt (T = √n): copy chain_rule_sqrt_shift with T := √n: the identity: deriv(deriv (φ∘√)) n = (φ″(√n) − φ′(√n)/√n)/(4n) — same form as shift version with √n instead of... wait the shift version: (φ″(T) − φ′(T)/√n)/(4n) where T = √n+1 — the division is by √n = T−1 ✓ same formula with T = √n: (φ″(√n) − φ′(√n)/√n)/(4n) ✓. The proof: drop the +1 (differentiableAt of √ alone instead of √·+1).\n\nActually — can I just APPLY chain_rule_sqrt_shift_on to ψ with... no, the shift matters. Write it directly (it's a short adaptation). For IIMaj, ψ̃ is globally ContDiff — so chain_rule_sqrt with (hψ : ContDiff ℝ 2 ψ) global — even simpler (mirror of the original global proof).\n\nWrite S1 now. Then build.","signature":""},{"type":"text","text":"API confirmed. Writing S1: the two chain-rule infrastructure lemmas."},{"type":"tool_use","id":"Edit_92","name":"Edit","input":{"file_path":"D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\NguyenRH1\\LiSkeleton.lean","old_string":"/-- [PROVED session 011] The D-057 chain-rule identity behind the\n11-block reduction: with T(n) = √n + 1,\nd²/dn² φ(T(n)) = [φ″(T) − φ′(T)/(T−1)] / (4n), written with\n√n = T−1. (Warm-up proof; first sorry eliminated from the library.) -/\ntheorem chain_rule_sqrt_shift (φ : ℝ → ℝ) (hφ : ContDiff ℝ 2 φ)\n    (n : ℝ) (hn : 0 < n) :\n    deriv (deriv fun n => φ (Real.sqrt n + 1)) n =\n      (deriv (deriv φ) (Real.sqrt n + 1) -\n        deriv φ (Real.sqrt n + 1) / Real.sqrt n) / (4 * n) := by","new_string":"/-- [PROVED session 011] Localized variant of `chain_rule_sqrt_shift`:\nφ only needs to be C² on (−1, ∞) (all D-057 blocks: L1-singularities at\nT = −2, L2-singularities at T = −1). -/\ntheorem chain_rule_sqrt_shift_on (φ : ℝ → ℝ)\n    (hφ : ContDiffOn ℝ 2 φ (Set.Ioi (-1))) (n : ℝ) (hn : 0 < n) :\n    deriv (deriv fun n => φ (Real.sqrt n + 1)) n =\n      (deriv (deriv φ) (Real.sqrt n + 1) -\n        deriv φ (Real.sqrt n + 1) / Real.sqrt n) / (4 * n) := by\n  have hφd : DifferentiableOn ℝ φ (Set.Ioi (-1)) :=\n    hφ.differentiableOn (by norm_num)\n  have hφdd : DifferentiableOn ℝ (deriv φ) (Set.Ioi (-1)) :=\n    (hφ.deriv_of_isOpen isOpen_Ioi (by norm_num)).differentiableOn (by norm_num)\n  have hmem : ∀ m : ℝ, 0 < m → Set.Ioi (-1) ∈ 𝓝 (Real.sqrt m + 1) := by\n    intro m hm\n    exact Ioi_mem_nhds (by linarith [Real.sqrt_nonneg m])\n  have hφ1 : ∀ m : ℝ, 0 < m → DifferentiableAt ℝ φ (Real.sqrt m + 1) :=\n    fun m hm => hφd.differentiableAt (hmem m hm)\n  have hφ2 : DifferentiableAt ℝ (deriv φ) (Real.sqrt n + 1) :=\n    hφdd.differentiableAt (hmem n hn)\n  have hsqrt : HasDerivAt Real.sqrt (1 / (2 * Real.sqrt n)) n :=\n    Real.hasDerivAt_sqrt hn.ne'\n  have hdiff_sqrt : DifferentiableAt ℝ Real.sqrt n := hsqrt.differentiableAt\n  have hdiff_h : DifferentiableAt ℝ (fun n => Real.sqrt n + 1) n :=\n    hdiff_sqrt.add (differentiableAt_const 1)\n  have hpos : Set.Ioi (0 : ℝ) ∈ 𝓝 n := Ioi_mem_nhds hn\n  have hg1 : deriv (fun n => φ (Real.sqrt n + 1)) =ᶠ[𝓝 n]\n      fun n => deriv φ (Real.sqrt n + 1) * (2 * Real.sqrt n)⁻¹ := by\n    filter_upwards [hpos] with m hm\n    have hsm : HasDerivAt Real.sqrt (1 / (2 * Real.sqrt m)) m :=\n      Real.hasDerivAt_sqrt (ne_of_gt hm)\n    have hhm : DifferentiableAt ℝ (fun x => Real.sqrt x + 1) m :=\n      hsm.differentiableAt.add (differentiableAt_const 1)\n    have h1 : deriv (fun x => Real.sqrt x + 1) m = 1 / (2 * Real.sqrt m) := by\n      rw [deriv_add_const]\n      exact hsm.deriv\n    rw [show (fun x => φ (Real.sqrt x + 1)) = φ ∘ (fun x => Real.sqrt x + 1)\n        from rfl,\n      deriv_comp m (hφ1 m hm) hhm, h1]\n    ring\n  have hA : HasDerivAt (fun n => deriv φ (Real.sqrt n + 1))\n      (deriv (deriv φ) (Real.sqrt n + 1) * (1 / (2 * Real.sqrt n))) n := by\n    have h1 : HasDerivAt (fun x => Real.sqrt x + 1) (1 / (2 * Real.sqrt n)) n :=\n      hsqrt.add_const 1\n    have h2 : HasDerivAt (deriv φ) (deriv (deriv φ) (Real.sqrt n + 1))\n        (Real.sqrt n + 1) :=\n      hφ2.hasDerivAt\n    have h3 := h2.comp n h1\n    rwa [show (fun n => deriv φ (Real.sqrt n + 1)) =\n      deriv φ ∘ (fun n => Real.sqrt n + 1) from rfl]\n  have hB : HasDerivAt (fun n => (2 * Real.sqrt n)⁻¹)\n      (-(2 * (1 / (2 * Real.sqrt n))) / (2 * Real.sqrt n) ^ 2) n := by\n    have h1 : HasDerivAt (fun n => 2 * Real.sqrt n) (2 * (1 / (2 * Real.sqrt n))) n :=\n      hsqrt.const_mul 2\n    have h2 : (2 * Real.sqrt n) ≠ 0 :=\n      mul_ne_zero two_ne_zero (Real.sqrt_ne_zero'.2 hn)\n    exact h1.inv h2\n  have hmul : HasDerivAt (fun n => deriv φ (Real.sqrt n + 1) * (2 * Real.sqrt n)⁻¹)\n      (deriv (deriv φ) (Real.sqrt n + 1) * (1 / (2 * Real.sqrt n)) * (2 * Real.sqrt n)⁻¹ +\n        deriv φ (Real.sqrt n + 1) *\n          (-(2 * (1 / (2 * Real.sqrt n))) / (2 * Real.sqrt n) ^ 2)) n :=\n    hA.mul hB\n  have hder := (hmul.congr_of_eventuallyEq hg1).deriv\n  rw [hder]\n  set s := Real.sqrt n with hsdef\n  have hs0 : s ≠ 0 := Real.sqrt_ne_zero'.2 hn\n  have hn_eq : n = s ^ 2 := by\n    rw [hsdef]; exact (Real.sq_sqrt hn.le).symm\n  rw [hn_eq]\n  field_simp [hs0]\n  ring\n\n/-- [PROVED session 011] Chain-rule identity with T(n) = √n (no shift),\nfor the IIMaj term: d²/dn² ψ(√n) = [ψ″(√n) − ψ′(√n)/√n] / (4n). -/\ntheorem chain_rule_sqrt (ψ : ℝ → ℝ) (hψ : ContDiff ℝ 2 ψ)\n    (n : ℝ) (hn : 0 < n) :\n    deriv (deriv fun n => ψ (Real.sqrt n)) n =\n      (deriv (deriv ψ) (Real.sqrt n) -\n        deriv ψ (Real.sqrt n) / Real.sqrt n) / (4 * n) := by\n  have hψ1 : Differentiable ℝ ψ := hψ.differentiable (by norm_num)\n  have hψ2 : Differentiable ℝ (deriv ψ) :=\n    (hψ.deriv' (n := 1)).differentiable one_ne_zero\n  have hsqrt : HasDerivAt Real.sqrt (1 / (2 * Real.sqrt n)) n :=\n    Real.hasDerivAt_sqrt hn.ne'\n  have hpos : Set.Ioi (0 : ℝ) ∈ 𝓝 n := Ioi_mem_nhds hn\n  have hg1 : deriv (fun n => ψ (Real.sqrt n)) =ᶠ[𝓝 n]\n      fun n => deriv ψ (Real.sqrt n) * (2 * Real.sqrt n)⁻¹ := by\n    filter_upwards [hpos] with m hm\n    have hsm : HasDerivAt Real.sqrt (1 / (2 * Real.sqrt m)) m :=\n      Real.hasDerivAt_sqrt (ne_of_gt hm)\n    rw [show (fun x => ψ (Real.sqrt x)) = ψ ∘ Real.sqrt from rfl,\n      deriv_comp m (hψ1 (Real.sqrt m)) hsm.differentiableAt, hsm.deriv]\n    ring\n  have hA : HasDerivAt (fun n => deriv ψ (Real.sqrt n))\n      (deriv (deriv ψ) (Real.sqrt n) * (1 / (2 * Real.sqrt n))) n := by\n    have h2 : HasDerivAt (deriv ψ) (deriv (deriv ψ) (Real.sqrt n))\n        (Real.sqrt n) :=\n      (hψ2 (Real.sqrt n)).hasDerivAt\n    have h3 := h2.comp n hsqrt\n    rwa [show (fun n => deriv ψ (Real.sqrt n)) = deriv ψ ∘ Real.sqrt from rfl]\n  have hB : HasDerivAt (fun n => (2 * Real.sqrt n)⁻¹)\n      (-(2 * (1 / (2 * Real.sqrt n))) / (2 * Real.sqrt n) ^ 2) n := by\n    have h1 : HasDerivAt (fun n => 2 * Real.sqrt n) (2 * (1 / (2 * Real.sqrt n))) n :=\n      hsqrt.const_mul 2\n    have h2 : (2 * Real.sqrt n) ≠ 0 :=\n      mul_ne_zero two_ne_zero (Real.sqrt_ne_zero'.2 hn)\n    exact h1.inv h2\n  have hmul : HasDerivAt (fun n => deriv ψ (Real.sqrt n) * (2 * Real.sqrt n)⁻¹)\n      (deriv (deriv ψ) (Real.sqrt n) * (1 / (2 * Real.sqrt n)) * (2 * Real.sqrt n)⁻¹ +\n        deriv ψ (Real.sqrt n) *\n          (-(2 * (1 / (2 * Real.sqrt n))) / (2 * Real.sqrt n) ^ 2)) n :=\n    hA.mul hB\n  have hder := (hmul.congr_of_eventuallyEq hg1).deriv\n  rw [hder]\n  set s := Real.sqrt n with hsdef\n  have hs0 : s ≠ 0 := Real.sqrt_ne_zero'.2 hn\n  have hn_eq : n = s ^ 2 := by\n    rw [hsdef]; exact (Real.sq_sqrt hn.le).symm\n  rw [hn_eq]\n  field_simp [hs0]\n  ring\n\n/-- [PROVED session 011] The D-057 chain-rule identity behind the\n11-block reduction: with T(n) = √n + 1,\nd²/dn² φ(T(n)) = [φ″(T) − φ′(T)/(T−1)] / (4n), written with\n√n = T−1. (Warm-up proof; first sorry eliminated from the library.) -/\ntheorem chain_rule_sqrt_shift (φ : ℝ → ℝ) (hφ : ContDiff ℝ 2 φ)\n    (n : ℝ) (hn : 0 < n) :\n    deriv (deriv fun n => φ (Real.sqrt n + 1)) n =\n      (deriv (deriv φ) (Real.sqrt n + 1) -\n        deriv φ (Real.sqrt n + 1) / Real.sqrt n) / (4 * n) := by"},"extra_content":null}]