Current task: —

← Session 21 — Tier ii′ planning + launch: close SfBoundProp in Lean (D-064)

#914 assistant 2026-08-21 19:26:01.861 UTC · 559→3919 tok open ⤢
thinking (1471 chars)
`Complex.normSq_eq_norm_sq : normSq z = ‖z‖ ^ 2` exists ✓ (used at Analysis/Complex/Basic.lean:96). Use that directly. Now rewrite the scratch with all fixes: 1. liSummand/summand_conj: use `Complex.conj` (qualified). 2. hbase via linarith from add_one_le_exp. 3. hnsq via Complex.normSq_eq_norm_sq. 4. hf: clean rewrite. 5. max_le first arg via le_add_of_nonneg_right. 6. hSn1 via explicit e + ← sum_sub_distrib. 7. liSummand_eq: rw [liSummand, summand_conj, Complex.add_conj]; push_cast; ring. One more: Complex.add_conj statement: `theorem add_conj (z : ℂ) : z + conj z = (2 * z.re : ℝ)` — note the cast: the RHS `(2 * z.re : ℝ)` is ℝ then coerced: actually written `(2 * z.re : ℝ)` with target ℂ, so it's `((2 * z.re : ℝ) : ℂ)`. So after rw, goal: ↑(zeroMult)/2 * ↑(2 * f.re) = ↑(zeroMult) * ↑(f.re) — push_cast then ring ✓. Also summand_conj's `rw [map_sub, map_one, map_pow, map_sub, map_one, map_div₀, map_one]` — conj = starRingEnd ℂ; map_sub (starRingEnd ℂ) : conj (a−b) = conj a − conj b ✓. The statement has conj ((1 − (1 − 1/z)^n)) on RHS; rw works left-to-right on goal `1 − (1 − 1/conj z)^n = conj (1 − (1 − 1/z)^n)`: the rw of map_sub applies to the RHS occurrence `conj (1 − ...)` → `conj 1 − conj ((1 − 1/z)^n)` then map_one: `1 − conj(...)`; map_pow: `conj(1 − 1/z)^n`; map_sub: `(conj 1 − conj (1/z))^n`; map_one; map_div₀: `conj 1 / conj z`; map_one: `1 / conj z` ✓ goal becomes `1 − (1 − 1/conj z)^n = 1 − (1 − 1/conj z)^n` rfl ✓. Write the file.
`Complex.normSq_eq_norm_sq` exists. Rewriting with all fixes.
tool: Write
input
{
  "file_path": "D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\Scratch.lean",
  "content": "/- Session 015 scratch: ii\u2032-1a \u2014 paired liSummand + summability (D-064 \u00a71).\n   When green, merge into LiSkeleton.lean \u00a71 replacing the defective liCoeff. -/\nimport Mathlib\nimport Zeta23.WeilEF.ZeroSummability\nimport Zeta23.Statement.SeamClosed\n\nopen Zeta23 Complex Filter Topology\n\nnoncomputable section\n\nnamespace NguyenRH1\n\n/-- The paired (symmetrized) Li summand: \u00bd\u00b7mult\u00b7(f \u03c1 + f \u03c1\u0304),\nf \u03c1 = 1 \u2212 (1\u22121/\u03c1)\u207f. Manifestly real-valued (`liSummand_eq`), absolutely\nsummable (`liSummable`) \u2014 the correct Keiper\u2013Li coefficient (D-064 \u00a71:\nthe plain unordered sum of f over the zeros is not absolutely\nsummable; the pairing is the classical Bombieri\u2013Lagarias convention). -/\ndef liSummand (n : \u2115) (\u03c1 : {\u03c1 : \u2102 // IsNontrivialZero \u03c1}) : \u2102 :=\n  (zeroMult \u03c1 : \u2102) / 2 *\n    ((1 - (1 - 1 / (\u03c1 : \u2102)) ^ n) + (1 - (1 - 1 / (Complex.conj (\u03c1 : \u2102))) ^ n))\n\nlemma summand_conj (n : \u2115) (z : \u2102) :\n    (1 : \u2102) - (1 - 1 / (Complex.conj z)) ^ n = Complex.conj ((1 - (1 - 1 / z) ^ n)) := by\n  rw [map_sub, map_one, map_pow, map_sub, map_one, map_div\u2080, map_one]\n\nlemma liSummand_eq (n : \u2115) (\u03c1 : {\u03c1 : \u2102 // IsNontrivialZero \u03c1}) :\n    liSummand n \u03c1 = (zeroMult \u03c1 : \u2102) * (((1 - (1 - 1 / (\u03c1 : \u2102)) ^ n).re) : \u2102) := by\n  rw [liSummand, summand_conj, Complex.add_conj]\n  push_cast\n  ring\n\n/-! ### The geometric-sum estimate: |Re(1 \u2212 w\u207f)| \u2264 2n\u00b2/\u2016z\u2016\u00b2 for w = 1\u22121/z -/\n\n/-- (1 + 1/(2n))\u207f \u2264 2 for n \u2265 1. Via (1+x)\u207f \u2264 exp(nx) and exp(1/2) \u2264 2. -/\nlemma pow_one_add_inv_two_mul_le (n : \u2115) (hn : 1 \u2264 n) :\n    ((1 : \u211d) + 1 / (2 * n)) ^ n \u2264 2 := by\n  have hn0 : (0 : \u211d) < n := by exact_mod_cast hn\n  have hbase : (1 : \u211d) + 1 / (2 * n) \u2264 Real.exp (1 / (2 * n)) := by\n    have h := Real.add_one_le_exp (1 / (2 * (n : \u211d)))\n    linarith\n  have h1 : ((1 : \u211d) + 1 / (2 * n)) ^ n \u2264 Real.exp (1 / 2) := by\n    calc ((1 : \u211d) + 1 / (2 * n)) ^ n\n        \u2264 (Real.exp (1 / (2 * n))) ^ n := pow_le_pow_left\u2080 (by positivity) hbase n\n      _ = Real.exp (\u2191n * (1 / (2 * n))) := by rw [Real.exp_nat_mul]\n      _ = Real.exp (1 / 2) := by congr 1; field_simp\n  have h2 : Real.exp (1 / 2 : \u211d) \u2264 2 := by\n    have h3 : (1 : \u211d) / 2 \u2264 Real.log 2 := by\n      have h := Real.log_two_gt_d9\n      linarith\n    calc Real.exp (1 / 2 : \u211d) \u2264 Real.exp (Real.log 2) := Real.exp_le_exp.mpr h3\n      _ = 2 := Real.exp_log (by norm_num)\n  exact h1.trans h2\n\n/-- Key estimate: for n \u2265 1, z with re z \u2208 [0,1], 2n \u2264 \u2016z\u2016:\n|Re(1 \u2212 (1\u22121/z)\u207f)| \u2264 2n\u00b2/\u2016z\u2016\u00b2. -/\nlemma re_li_summand_le {n : \u2115} (hn : 1 \u2264 n) {z : \u2102}\n    (hzre0 : 0 \u2264 z.re) (hzre1 : z.re \u2264 1) (hz : 2 * n \u2264 \u2016z\u2016) :\n    |(1 - (1 - 1 / z) ^ n).re| \u2264 2 * n ^ 2 / \u2016z\u2016 ^ 2 := by\n  have hn0 : (0 : \u211d) < n := by exact_mod_cast hn\n  have hz0 : z \u2260 0 := by\n    intro h; rw [h, norm_zero] at hz; linarith\n  have hzn : (0 : \u211d) < \u2016z\u2016 := norm_pos_iff.mpr hz0\n  have hnsq : Complex.normSq z = \u2016z\u2016 ^ 2 := Complex.normSq_eq_norm_sq z\n  set w : \u2102 := 1 - 1 / z with hw\n  -- kernel identity: 1 \u2212 w\u207f = (1/z)\u00b7S, S = \u03a3_{j<n} w^j\n  have hgeom : (w - 1) * \u2211 j \u2208 Finset.range n, w ^ j = w ^ n - 1 := mul_geom_sum w n\n  have hw1 : w - 1 = -(1 / z) := by rw [hw]; ring\n  have hf : (1 : \u2102) - w ^ n = (1 / z) * \u2211 j \u2208 Finset.range n, w ^ j := by\n    have e : (1 : \u2102) - w ^ n = -(w ^ n - 1) := by ring\n    rw [e, \u2190 hgeom, hw1]; ring\n  set S : \u2102 := \u2211 j \u2208 Finset.range n, w ^ j\n  have hS : S = (n : \u2102) + (S - n) := by ring\n  -- \u2016w\u2016 \u2264 1 + 1/\u2016z\u2016\n  have hwnorm : \u2016w\u2016 \u2264 1 + 1 / \u2016z\u2016 := by\n    have e : w = 1 - z\u207b\u00b9 := by rw [hw, div_eq_mul_inv, one_mul]\n    rw [e]\n    calc \u2016(1 : \u2102) - z\u207b\u00b9\u2016 \u2264 \u2016(1 : \u2102)\u2016 + \u2016z\u207b\u00b9\u2016 := norm_sub_le _ _\n      _ = 1 + 1 / \u2016z\u2016 := by rw [norm_one, norm_inv, inv_eq_one_div]\n  have h1z : 1 / \u2016z\u2016 \u2264 1 / (2 * n) :=\n    one_div_le_one_div_of_le (by positivity) (by exact_mod_cast hz)\n  have hwmax : max 1 \u2016w\u2016 \u2264 1 + 1 / (2 * n) := by\n    apply max_le (le_add_of_nonneg_right (by positivity))\n    exact hwnorm.trans (by linarith)\n  -- |S \u2212 n| \u2264 n\u00b2/\u2016z\u2016\n  have hSn : \u2016S - n\u2016 \u2264 n ^ 2 / \u2016z\u2016 := by\n    have hSn1 : S - n = \u2211 j \u2208 Finset.range n, (w ^ j - 1) := by\n      have e : (n : \u2102) = \u2211 j \u2208 Finset.range n, (1 : \u2102) := by\n        simp [Finset.sum_const, Finset.card_range]\n      rw [e, \u2190 Finset.sum_sub_distrib]\n    have hbound : \u2200 j \u2208 Finset.range n,\n        \u2016w ^ j - 1\u2016 \u2264 (1 / \u2016z\u2016) * (j * (1 + 1 / (2 * n)) ^ (n - 1)) := by\n      intro j hj\n      have hgeomj : (w - 1) * \u2211 i \u2208 Finset.range j, w ^ i = w ^ j - 1 := mul_geom_sum w j\n      have hjn : j \u2264 n := le_of_lt (Finset.mem_range.mp hj)\n      have h2 : w ^ j - 1 = -(1 / z) * \u2211 i \u2208 Finset.range j, w ^ i := by\n        have h := hgeomj; rw [hw1] at h\n        rw [\u2190 h]; ring\n      rw [h2, norm_mul, norm_neg, norm_div, norm_one]\n      have hsum : \u2016\u2211 i \u2208 Finset.range j, w ^ i\u2016 \u2264 j * (1 + 1 / (2 * n)) ^ (n - 1) := by\n        calc \u2016\u2211 i \u2208 Finset.range j, w ^ i\u2016\n            \u2264 \u2211 i \u2208 Finset.range j, \u2016w ^ i\u2016 := norm_sum_le _ _\n          _ \u2264 \u2211 i \u2208 Finset.range j, (1 + 1 / (2 * n)) ^ (n - 1) := by\n              apply Finset.sum_le_sum\n              intro i hi\n              rw [norm_pow]\n              have hij : i < j := Finset.mem_range.mp hi\n              have h1 : \u2016w\u2016 ^ i \u2264 (1 + 1 / (2 * n)) ^ i :=\n                pow_le_pow_left\u2080 (norm_nonneg _)\n                  (le_trans (le_max_right 1 \u2016w\u2016) hwmax) i\n              have h2 : (1 + 1 / (2 * n)) ^ i \u2264 (1 + 1 / (2 * n)) ^ (n - 1) := by\n                apply pow_le_pow_right\u2080 (by positivity)\n                omega\n              exact h1.trans h2\n          _ = j * (1 + 1 / (2 * n)) ^ (n - 1) := by\n              rw [Finset.sum_const, Finset.card_range, nsmul_eq_mul]\n      exact mul_le_mul_of_nonneg_left hsum (by positivity)\n    calc \u2016\u2211 j \u2208 Finset.range n, (w ^ j - 1)\u2016\n        \u2264 \u2211 j \u2208 Finset.range n, \u2016w ^ j - 1\u2016 := norm_sum_le _ _\n      _ \u2264 \u2211 j \u2208 Finset.range n, (1 / \u2016z\u2016) * (j * (1 + 1 / (2 * n)) ^ (n - 1)) := by\n          rw [hSn1] at *\n          exact Finset.sum_le_sum hbound\n      _ = ((1 / \u2016z\u2016) * (1 + 1 / (2 * n)) ^ (n - 1)) * \u2211 j \u2208 Finset.range n, j := by\n          rw [\u2190 Finset.mul_sum]\n          apply Finset.sum_congr rfl\n          intro j _; ring\n      _ \u2264 n ^ 2 / \u2016z\u2016 := by\n          have hsumj : (\u2211 j \u2208 Finset.range n, j : \u211d) = n * (n - 1) / 2 := by\n            have h := Finset.sum_range_id_mul_two n\n            have h2 : ((\u2211 j \u2208 Finset.range n, j : \u2115) : \u211d) * 2 = n * (n - 1) := by\n              exact_mod_cast h\n            linarith\n          rw [hsumj]\n          have hpow : (1 + 1 / (2 * n : \u211d)) ^ (n - 1) \u2264 2 :=\n            le_trans (pow_le_pow_right\u2080 (by positivity) (Nat.sub_le n 1))\n              (pow_one_add_inv_two_mul_le n hn)\n          have hb1 : (n : \u211d) * (n - 1) / 2 \u2264 n ^ 2 / 2 := by nlinarith [hn0]\n          have hb2 : (1 + 1 / (2 * n : \u211d)) ^ (n - 1) * (n * (n - 1) / 2)\n              \u2264 2 * (n ^ 2 / 2) :=\n            mul_le_mul_of_nonneg hpow hb1 (by positivity) (by positivity)\n          have hb3 : ((1 : \u211d) / \u2016z\u2016) * (1 + 1 / (2 * n)) ^ (n - 1) * (n * (n - 1) / 2)\n              \u2264 (1 / \u2016z\u2016) * (2 * (n ^ 2 / 2)) :=\n            mul_le_mul_of_nonneg_left hb2 (by positivity)\n          exact hb3.trans (by ring_nf)\n  -- Re(f) = n\u00b7z.re/\u2016z\u2016\u00b2 + ((S\u2212n)/z).re\n  have hre1 : ((n : \u2102) * (1 / z)).re = n * z.re / \u2016z\u2016 ^ 2 := by\n    have hinv : ((1 : \u2102) / z).re = z.re / \u2016z\u2016 ^ 2 := by\n      rw [one_div, Complex.inv_re, hnsq]\n    rw [Complex.mul_re]\n    simp [hinv]\n  have hfre : (1 - w ^ n).re = n * z.re / \u2016z\u2016 ^ 2 + ((S - n) / z).re := by\n    rw [hf, hS, Complex.add_re]\n    congr 1\n    rw [mul_comm, div_eq_mul_inv]\n    exact hre1\n  rw [hfre]\n  have hA : |n * z.re / \u2016z\u2016 ^ 2| \u2264 n / \u2016z\u2016 ^ 2 := by\n    rw [abs_div, abs_mul, abs_of_nonneg hn0.le,\n      abs_of_nonneg (sq_nonneg \u2016z\u2016)]\n    apply (div_le_div_right (by positivity)).mpr\n    apply mul_le_mul_of_nonneg_left _ hn0.le\n    exact abs_le.mpr \u27e8hzre0, hzre1\u27e9\n  have hB : |((S - n) / z).re| \u2264 n ^ 2 / \u2016z\u2016 ^ 2 := by\n    have h1 : |((S - n) / z).re| \u2264 \u2016(S - n) / z\u2016 := Complex.abs_re_le_norm _\n    have h2 : \u2016(S - n) / z\u2016 \u2264 (n ^ 2 / \u2016z\u2016) / \u2016z\u2016 := by\n      rw [norm_div]\n      exact (div_le_div_right hzn).mpr hSn\n    exact h1.trans (h2.trans (by rw [div_div, \u2190 pow_two]))\n  have hnn : (n : \u211d) \u2264 n ^ 2 := by\n    have h : (1 : \u211d) \u2264 n := by exact_mod_cast hn\n    nlinarith\n  calc |n * z.re / \u2016z\u2016 ^ 2 + ((S - n) / z).re|\n      \u2264 n / \u2016z\u2016 ^ 2 + n ^ 2 / \u2016z\u2016 ^ 2 := (abs_add _ _).trans (add_le_add hA hB)\n    _ = (n + n ^ 2) / \u2016z\u2016 ^ 2 := by ring\n    _ \u2264 2 * n ^ 2 / \u2016z\u2016 ^ 2 := by\n        apply (div_le_div_right (by positivity)).mpr\n        linarith\n\nend NguyenRH1\n"
}
raw content_json (database row)
[{"type":"thinking","thinking":"`Complex.normSq_eq_norm_sq : normSq z = ‖z‖ ^ 2` exists ✓ (used at Analysis/Complex/Basic.lean:96). Use that directly.\n\nNow rewrite the scratch with all fixes:\n1. liSummand/summand_conj: use `Complex.conj` (qualified).\n2. hbase via linarith from add_one_le_exp.\n3. hnsq via Complex.normSq_eq_norm_sq.\n4. hf: clean rewrite.\n5. max_le first arg via le_add_of_nonneg_right.\n6. hSn1 via explicit e + ← sum_sub_distrib.\n7. liSummand_eq: rw [liSummand, summand_conj, Complex.add_conj]; push_cast; ring.\n\nOne more: Complex.add_conj statement: `theorem add_conj (z : ℂ) : z + conj z = (2 * z.re : ℝ)` — note the cast: the RHS `(2 * z.re : ℝ)` is ℝ then coerced: actually written `(2 * z.re : ℝ)` with target ℂ, so it's `((2 * z.re : ℝ) : ℂ)`. So after rw, goal: ↑(zeroMult)/2 * ↑(2 * f.re) = ↑(zeroMult) * ↑(f.re) — push_cast then ring ✓.\n\nAlso summand_conj's `rw [map_sub, map_one, map_pow, map_sub, map_one, map_div₀, map_one]` — conj = starRingEnd ℂ; map_sub (starRingEnd ℂ) : conj (a−b) = conj a − conj b ✓. The statement has conj ((1 − (1 − 1/z)^n)) on RHS; rw works left-to-right on goal `1 − (1 − 1/conj z)^n = conj (1 − (1 − 1/z)^n)`: the rw of map_sub applies to the RHS occurrence `conj (1 − ...)` → `conj 1 − conj ((1 − 1/z)^n)` then map_one: `1 − conj(...)`; map_pow: `conj(1 − 1/z)^n`; map_sub: `(conj 1 − conj (1/z))^n`; map_one; map_div₀: `conj 1 / conj z`; map_one: `1 / conj z` ✓ goal becomes `1 − (1 − 1/conj z)^n = 1 − (1 − 1/conj z)^n` rfl ✓.\n\nWrite the file.","signature":""},{"type":"text","text":"`Complex.normSq_eq_norm_sq` exists. Rewriting with all fixes."},{"type":"tool_use","id":"Write_95","name":"Write","input":{"file_path":"D:\\Python\\Quantum\\research\\lean\\NguyenRH1\\Scratch.lean","content":"/- Session 015 scratch: ii′-1a — paired liSummand + summability (D-064 §1).\n   When green, merge into LiSkeleton.lean §1 replacing the defective liCoeff. -/\nimport Mathlib\nimport Zeta23.WeilEF.ZeroSummability\nimport Zeta23.Statement.SeamClosed\n\nopen Zeta23 Complex Filter Topology\n\nnoncomputable section\n\nnamespace NguyenRH1\n\n/-- The paired (symmetrized) Li summand: ½·mult·(f ρ + f ρ̄),\nf ρ = 1 − (1−1/ρ)ⁿ. Manifestly real-valued (`liSummand_eq`), absolutely\nsummable (`liSummable`) — the correct Keiper–Li coefficient (D-064 §1:\nthe plain unordered sum of f over the zeros is not absolutely\nsummable; the pairing is the classical Bombieri–Lagarias convention). -/\ndef liSummand (n : ℕ) (ρ : {ρ : ℂ // IsNontrivialZero ρ}) : ℂ :=\n  (zeroMult ρ : ℂ) / 2 *\n    ((1 - (1 - 1 / (ρ : ℂ)) ^ n) + (1 - (1 - 1 / (Complex.conj (ρ : ℂ))) ^ n))\n\nlemma summand_conj (n : ℕ) (z : ℂ) :\n    (1 : ℂ) - (1 - 1 / (Complex.conj z)) ^ n = Complex.conj ((1 - (1 - 1 / z) ^ n)) := by\n  rw [map_sub, map_one, map_pow, map_sub, map_one, map_div₀, map_one]\n\nlemma liSummand_eq (n : ℕ) (ρ : {ρ : ℂ // IsNontrivialZero ρ}) :\n    liSummand n ρ = (zeroMult ρ : ℂ) * (((1 - (1 - 1 / (ρ : ℂ)) ^ n).re) : ℂ) := by\n  rw [liSummand, summand_conj, Complex.add_conj]\n  push_cast\n  ring\n\n/-! ### The geometric-sum estimate: |Re(1 − wⁿ)| ≤ 2n²/‖z‖² for w = 1−1/z -/\n\n/-- (1 + 1/(2n))ⁿ ≤ 2 for n ≥ 1. Via (1+x)ⁿ ≤ exp(nx) and exp(1/2) ≤ 2. -/\nlemma pow_one_add_inv_two_mul_le (n : ℕ) (hn : 1 ≤ n) :\n    ((1 : ℝ) + 1 / (2 * n)) ^ n ≤ 2 := by\n  have hn0 : (0 : ℝ) < n := by exact_mod_cast hn\n  have hbase : (1 : ℝ) + 1 / (2 * n) ≤ Real.exp (1 / (2 * n)) := by\n    have h := Real.add_one_le_exp (1 / (2 * (n : ℝ)))\n    linarith\n  have h1 : ((1 : ℝ) + 1 / (2 * n)) ^ n ≤ Real.exp (1 / 2) := by\n    calc ((1 : ℝ) + 1 / (2 * n)) ^ n\n        ≤ (Real.exp (1 / (2 * n))) ^ n := pow_le_pow_left₀ (by positivity) hbase n\n      _ = Real.exp (↑n * (1 / (2 * n))) := by rw [Real.exp_nat_mul]\n      _ = Real.exp (1 / 2) := by congr 1; field_simp\n  have h2 : Real.exp (1 / 2 : ℝ) ≤ 2 := by\n    have h3 : (1 : ℝ) / 2 ≤ Real.log 2 := by\n      have h := Real.log_two_gt_d9\n      linarith\n    calc Real.exp (1 / 2 : ℝ) ≤ Real.exp (Real.log 2) := Real.exp_le_exp.mpr h3\n      _ = 2 := Real.exp_log (by norm_num)\n  exact h1.trans h2\n\n/-- Key estimate: for n ≥ 1, z with re z ∈ [0,1], 2n ≤ ‖z‖:\n|Re(1 − (1−1/z)ⁿ)| ≤ 2n²/‖z‖². -/\nlemma re_li_summand_le {n : ℕ} (hn : 1 ≤ n) {z : ℂ}\n    (hzre0 : 0 ≤ z.re) (hzre1 : z.re ≤ 1) (hz : 2 * n ≤ ‖z‖) :\n    |(1 - (1 - 1 / z) ^ n).re| ≤ 2 * n ^ 2 / ‖z‖ ^ 2 := by\n  have hn0 : (0 : ℝ) < n := by exact_mod_cast hn\n  have hz0 : z ≠ 0 := by\n    intro h; rw [h, norm_zero] at hz; linarith\n  have hzn : (0 : ℝ) < ‖z‖ := norm_pos_iff.mpr hz0\n  have hnsq : Complex.normSq z = ‖z‖ ^ 2 := Complex.normSq_eq_norm_sq z\n  set w : ℂ := 1 - 1 / z with hw\n  -- kernel identity: 1 − wⁿ = (1/z)·S, S = Σ_{j<n} w^j\n  have hgeom : (w - 1) * ∑ j ∈ Finset.range n, w ^ j = w ^ n - 1 := mul_geom_sum w n\n  have hw1 : w - 1 = -(1 / z) := by rw [hw]; ring\n  have hf : (1 : ℂ) - w ^ n = (1 / z) * ∑ j ∈ Finset.range n, w ^ j := by\n    have e : (1 : ℂ) - w ^ n = -(w ^ n - 1) := by ring\n    rw [e, ← hgeom, hw1]; ring\n  set S : ℂ := ∑ j ∈ Finset.range n, w ^ j\n  have hS : S = (n : ℂ) + (S - n) := by ring\n  -- ‖w‖ ≤ 1 + 1/‖z‖\n  have hwnorm : ‖w‖ ≤ 1 + 1 / ‖z‖ := by\n    have e : w = 1 - z⁻¹ := by rw [hw, div_eq_mul_inv, one_mul]\n    rw [e]\n    calc ‖(1 : ℂ) - z⁻¹‖ ≤ ‖(1 : ℂ)‖ + ‖z⁻¹‖ := norm_sub_le _ _\n      _ = 1 + 1 / ‖z‖ := by rw [norm_one, norm_inv, inv_eq_one_div]\n  have h1z : 1 / ‖z‖ ≤ 1 / (2 * n) :=\n    one_div_le_one_div_of_le (by positivity) (by exact_mod_cast hz)\n  have hwmax : max 1 ‖w‖ ≤ 1 + 1 / (2 * n) := by\n    apply max_le (le_add_of_nonneg_right (by positivity))\n    exact hwnorm.trans (by linarith)\n  -- |S − n| ≤ n²/‖z‖\n  have hSn : ‖S - n‖ ≤ n ^ 2 / ‖z‖ := by\n    have hSn1 : S - n = ∑ j ∈ Finset.range n, (w ^ j - 1) := by\n      have e : (n : ℂ) = ∑ j ∈ Finset.range n, (1 : ℂ) := by\n        simp [Finset.sum_const, Finset.card_range]\n      rw [e, ← Finset.sum_sub_distrib]\n    have hbound : ∀ j ∈ Finset.range n,\n        ‖w ^ j - 1‖ ≤ (1 / ‖z‖) * (j * (1 + 1 / (2 * n)) ^ (n - 1)) := by\n      intro j hj\n      have hgeomj : (w - 1) * ∑ i ∈ Finset.range j, w ^ i = w ^ j - 1 := mul_geom_sum w j\n      have hjn : j ≤ n := le_of_lt (Finset.mem_range.mp hj)\n      have h2 : w ^ j - 1 = -(1 / z) * ∑ i ∈ Finset.range j, w ^ i := by\n        have h := hgeomj; rw [hw1] at h\n        rw [← h]; ring\n      rw [h2, norm_mul, norm_neg, norm_div, norm_one]\n      have hsum : ‖∑ i ∈ Finset.range j, w ^ i‖ ≤ j * (1 + 1 / (2 * n)) ^ (n - 1) := by\n        calc ‖∑ i ∈ Finset.range j, w ^ i‖\n            ≤ ∑ i ∈ Finset.range j, ‖w ^ i‖ := norm_sum_le _ _\n          _ ≤ ∑ i ∈ Finset.range j, (1 + 1 / (2 * n)) ^ (n - 1) := by\n              apply Finset.sum_le_sum\n              intro i hi\n              rw [norm_pow]\n              have hij : i < j := Finset.mem_range.mp hi\n              have h1 : ‖w‖ ^ i ≤ (1 + 1 / (2 * n)) ^ i :=\n                pow_le_pow_left₀ (norm_nonneg _)\n                  (le_trans (le_max_right 1 ‖w‖) hwmax) i\n              have h2 : (1 + 1 / (2 * n)) ^ i ≤ (1 + 1 / (2 * n)) ^ (n - 1) := by\n                apply pow_le_pow_right₀ (by positivity)\n                omega\n              exact h1.trans h2\n          _ = j * (1 + 1 / (2 * n)) ^ (n - 1) := by\n              rw [Finset.sum_const, Finset.card_range, nsmul_eq_mul]\n      exact mul_le_mul_of_nonneg_left hsum (by positivity)\n    calc ‖∑ j ∈ Finset.range n, (w ^ j - 1)‖\n        ≤ ∑ j ∈ Finset.range n, ‖w ^ j - 1‖ := norm_sum_le _ _\n      _ ≤ ∑ j ∈ Finset.range n, (1 / ‖z‖) * (j * (1 + 1 / (2 * n)) ^ (n - 1)) := by\n          rw [hSn1] at *\n          exact Finset.sum_le_sum hbound\n      _ = ((1 / ‖z‖) * (1 + 1 / (2 * n)) ^ (n - 1)) * ∑ j ∈ Finset.range n, j := by\n          rw [← Finset.mul_sum]\n          apply Finset.sum_congr rfl\n          intro j _; ring\n      _ ≤ n ^ 2 / ‖z‖ := by\n          have hsumj : (∑ j ∈ Finset.range n, j : ℝ) = n * (n - 1) / 2 := by\n            have h := Finset.sum_range_id_mul_two n\n            have h2 : ((∑ j ∈ Finset.range n, j : ℕ) : ℝ) * 2 = n * (n - 1) := by\n              exact_mod_cast h\n            linarith\n          rw [hsumj]\n          have hpow : (1 + 1 / (2 * n : ℝ)) ^ (n - 1) ≤ 2 :=\n            le_trans (pow_le_pow_right₀ (by positivity) (Nat.sub_le n 1))\n              (pow_one_add_inv_two_mul_le n hn)\n          have hb1 : (n : ℝ) * (n - 1) / 2 ≤ n ^ 2 / 2 := by nlinarith [hn0]\n          have hb2 : (1 + 1 / (2 * n : ℝ)) ^ (n - 1) * (n * (n - 1) / 2)\n              ≤ 2 * (n ^ 2 / 2) :=\n            mul_le_mul_of_nonneg hpow hb1 (by positivity) (by positivity)\n          have hb3 : ((1 : ℝ) / ‖z‖) * (1 + 1 / (2 * n)) ^ (n - 1) * (n * (n - 1) / 2)\n              ≤ (1 / ‖z‖) * (2 * (n ^ 2 / 2)) :=\n            mul_le_mul_of_nonneg_left hb2 (by positivity)\n          exact hb3.trans (by ring_nf)\n  -- Re(f) = n·z.re/‖z‖² + ((S−n)/z).re\n  have hre1 : ((n : ℂ) * (1 / z)).re = n * z.re / ‖z‖ ^ 2 := by\n    have hinv : ((1 : ℂ) / z).re = z.re / ‖z‖ ^ 2 := by\n      rw [one_div, Complex.inv_re, hnsq]\n    rw [Complex.mul_re]\n    simp [hinv]\n  have hfre : (1 - w ^ n).re = n * z.re / ‖z‖ ^ 2 + ((S - n) / z).re := by\n    rw [hf, hS, Complex.add_re]\n    congr 1\n    rw [mul_comm, div_eq_mul_inv]\n    exact hre1\n  rw [hfre]\n  have hA : |n * z.re / ‖z‖ ^ 2| ≤ n / ‖z‖ ^ 2 := by\n    rw [abs_div, abs_mul, abs_of_nonneg hn0.le,\n      abs_of_nonneg (sq_nonneg ‖z‖)]\n    apply (div_le_div_right (by positivity)).mpr\n    apply mul_le_mul_of_nonneg_left _ hn0.le\n    exact abs_le.mpr ⟨hzre0, hzre1⟩\n  have hB : |((S - n) / z).re| ≤ n ^ 2 / ‖z‖ ^ 2 := by\n    have h1 : |((S - n) / z).re| ≤ ‖(S - n) / z‖ := Complex.abs_re_le_norm _\n    have h2 : ‖(S - n) / z‖ ≤ (n ^ 2 / ‖z‖) / ‖z‖ := by\n      rw [norm_div]\n      exact (div_le_div_right hzn).mpr hSn\n    exact h1.trans (h2.trans (by rw [div_div, ← pow_two]))\n  have hnn : (n : ℝ) ≤ n ^ 2 := by\n    have h : (1 : ℝ) ≤ n := by exact_mod_cast hn\n    nlinarith\n  calc |n * z.re / ‖z‖ ^ 2 + ((S - n) / z).re|\n      ≤ n / ‖z‖ ^ 2 + n ^ 2 / ‖z‖ ^ 2 := (abs_add _ _).trans (add_le_add hA hB)\n    _ = (n + n ^ 2) / ‖z‖ ^ 2 := by ring\n    _ ≤ 2 * n ^ 2 / ‖z‖ ^ 2 := by\n        apply (div_le_div_right (by positivity)).mpr\n        linarith\n\nend NguyenRH1\n"},"extra_content":null}]