77
88public import Mathlib.NumberTheory.LSeries.HurwitzZeta
99public import Mathlib.Analysis.PSeriesComplex
10+ public import Mathlib.Analysis.Calculus.Deriv.Star
11+ public import Mathlib.Analysis.Analytic.Uniqueness
1012
1113/-!
1214# Definition of the Riemann zeta function
@@ -33,6 +35,8 @@ Euler-Mascheroni constant will follow in a subsequent PR.
3335 `ζ(s) = ∑' (n : ℕ), 1 / (n + 1) ^ s`.
3436* `completedRiemannZeta₀_one_sub`, `completedRiemannZeta_one_sub`, and `riemannZeta_one_sub` :
3537 functional equation relating values at `s` and `1 - s`
38+ * `completedRiemannZeta₀_conj` and `completedRiemannZeta_conj` : Schwarz reflection identities
39+ `Λ₀(conj s) = conj (Λ₀ s)` and `Λ(conj s) = conj (Λ s)`
3640
3741 For special-value formulae expressing `ζ (2 * k)` and `ζ (1 - 2 * k)` in terms of Bernoulli numbers
3842see `Mathlib/NumberTheory/LSeries/HurwitzZetaValues.lean`. For computation of the constant term as
@@ -51,7 +55,7 @@ open CharZero Set Filter HurwitzZeta
5155
5256open Complex hiding exp continuous_exp
5357
54- open scoped Topology Real
58+ open scoped Topology Real ComplexConjugate
5559
5660noncomputable section
5761
@@ -243,3 +247,150 @@ theorem tendsto_sub_mul_tsum_nat_rpow :
243247 apply (tendsto_sub_mul_tsum_nat_cpow.comp this).congr fun s ↦ ?_
244248 simp only [one_div, Function.comp_apply, ofReal_mul, ofReal_sub, ofReal_one, ofReal_tsum,
245249 ofReal_inv, ofReal_cpow (Nat.cast_nonneg _), ofReal_natCast]
250+
251+ /-!
252+ ## Conjugation symmetry of the completed Riemann zeta function
253+
254+ We prove `completedRiemannZeta_conj : Λ(conj s) = conj (Λ s)`, the analogue
255+ of `Complex.Gamma_conj` for the completed zeta. Combined with `completedRiemannZeta_one_sub`
256+ this makes the symmetry group of `Λ` on `ℂ` explicit. The proof works in two steps:
257+
258+ 1. On the open half-plane `{Re s > 1}`, the Dirichlet series for `Λ`
259+ converges absolutely and conjugation commutes term-by-term with the
260+ series, with `Complex.Gamma_conj`, and with `cpow` of the positive real
261+ bases `π` and `n : ℕ` (via `Complex.conj_cpow`).
262+ 2. Both sides extend to entire (resp. meromorphic-with-explicit-poles)
263+ functions of `s`; the identity principle (`AnalyticOnNhd.eq_of_eventuallyEq`)
264+ propagates the equality from `{Re s > 1}` to all of `ℂ`.
265+
266+ The pole-decomposition `completedRiemannZeta_eq` is used to transfer the
267+ result from `Λ₀` (entire) to the full `Λ` (which has simple poles at `0` and `1`).
268+ -/
269+
270+ /-- Helper: conjugation acts equivariantly on `(↑n : ℂ) ^ s`. -/
271+ private lemma conj_natCast_cpow (n : ℕ) (s : ℂ) :
272+ conj ((n : ℂ) ^ s) = (n : ℂ) ^ (conj s) := by
273+ by_cases h : n = 0
274+ · subst h
275+ simp_rw [Nat.cast_zero]
276+ by_cases hs : s = 0
277+ · simp [hs]
278+ · have hcs : conj s ≠ 0 := by simp [hs]
279+ rw [zero_cpow hs, zero_cpow hcs, map_zero]
280+ · have harg : (n : ℂ).arg ≠ Real.pi := by
281+ rw [natCast_arg]
282+ exact ne_of_lt Real.pi_pos
283+ have hcn : conj ((n : ℂ)) = (n : ℂ) := by
284+ rw [show ((n : ℂ) : ℂ) = ((n : ℝ) : ℂ) by push_cast; rfl, Complex.conj_ofReal]
285+ have key := Complex.conj_cpow (n : ℂ) (conj s) harg
286+ rw [hcn] at key
287+ rw [key, Complex.conj_conj]
288+
289+ /-- Helper: conjugation acts equivariantly on `(↑(π : ℝ) : ℂ) ^ s`. -/
290+ private lemma conj_pi_cpow (s : ℂ) :
291+ conj ((Real.pi : ℂ) ^ s) = (Real.pi : ℂ) ^ (conj s) := by
292+ have harg : (Real.pi : ℂ).arg ≠ Real.pi := by
293+ rw [Complex.arg_ofReal_of_nonneg Real.pi_pos.le]
294+ exact ne_of_lt Real.pi_pos
295+ have hcpi : conj ((Real.pi : ℂ)) = (Real.pi : ℂ) := Complex.conj_ofReal _
296+ have key := Complex.conj_cpow (Real.pi : ℂ) (conj s) harg
297+ rw [hcpi] at key
298+ rw [key, Complex.conj_conj]
299+
300+ /-- The Dirichlet series for `completedRiemannZeta` is conj-equivariant on `{Re s > 1}`. -/
301+ private lemma completedRiemannZeta_conj_of_one_lt_re {s : ℂ} (hs : 1 < re s) :
302+ completedRiemannZeta (conj s) = conj (completedRiemannZeta s) := by
303+ have hcs : 1 < re (conj s) := by rw [Complex.conj_re]; exact hs
304+ rw [completedZeta_eq_tsum_of_one_lt_re hs, completedZeta_eq_tsum_of_one_lt_re hcs]
305+ rw [map_mul, map_mul]
306+ rw [conj_pi_cpow, ← Complex.Gamma_conj, Complex.conj_tsum]
307+ congr 1
308+ · congr 1
309+ · congr 1
310+ rw [map_div₀, map_neg, Complex.conj_ofNat]
311+ · congr 1
312+ rw [map_div₀, Complex.conj_ofNat]
313+ · apply tsum_congr
314+ intro n
315+ simp only [one_div, map_inv₀]
316+ rw [conj_natCast_cpow]
317+
318+ /-- `completedRiemannZeta₀` is conj-equivariant on `{Re s > 1}`. Derived from the
319+ identity on `Λ` via the pole-decomposition `completedRiemannZeta_eq`. -/
320+ private lemma completedRiemannZeta₀_conj_of_one_lt_re {s : ℂ} (hs : 1 < re s) :
321+ completedRiemannZeta₀ (conj s) = conj (completedRiemannZeta₀ s) := by
322+ have hcs : 1 < re (conj s) := by rw [Complex.conj_re]; exact hs
323+ have hs0 : s ≠ 0 := fun h => by rw [h] at hs; norm_num at hs
324+ have hs1 : s ≠ 1 := fun h => by rw [h, Complex.one_re] at hs; norm_num at hs
325+ have hcs0 : conj s ≠ 0 := fun h => by
326+ apply hs0
327+ have := congrArg conj h
328+ rwa [Complex.conj_conj, map_zero] at this
329+ have hcs1 : conj s ≠ 1 := fun h => by
330+ apply hs1
331+ have := congrArg conj h
332+ rwa [Complex.conj_conj, map_one] at this
333+ have ce1 : completedRiemannZeta (conj s) =
334+ completedRiemannZeta₀ (conj s) - 1 / (conj s) - 1 / (1 - conj s) :=
335+ completedRiemannZeta_eq (conj s)
336+ have ce2 : completedRiemannZeta s =
337+ completedRiemannZeta₀ s - 1 / s - 1 / (1 - s) :=
338+ completedRiemannZeta_eq s
339+ have key := completedRiemannZeta_conj_of_one_lt_re hs
340+ rw [ce1, ce2] at key
341+ rw [show conj (completedRiemannZeta₀ s - 1 / s - 1 / (1 - s)) =
342+ conj (completedRiemannZeta₀ s) - conj (1 / s) - conj (1 / (1 - s)) by
343+ rw [map_sub, map_sub]] at key
344+ have c1 : conj ((1 : ℂ) / s) = 1 / conj s := by rw [map_div₀, map_one]
345+ have c2 : conj ((1 : ℂ) / (1 - s)) = 1 / (1 - conj s) := by
346+ rw [map_div₀, map_one, map_sub, map_one]
347+ rw [c1, c2] at key
348+ linear_combination key
349+
350+ /-- The function `s ↦ conj (completedRiemannZeta₀ (conj s))` is entire. -/
351+ private lemma differentiable_conj_completedZeta₀_conj :
352+ Differentiable ℂ (fun s => conj (completedRiemannZeta₀ (conj s))) := by
353+ intro s
354+ have := (differentiable_completedZeta₀ (conj s)).conj_conj
355+ rw [Complex.conj_conj] at this
356+ exact this
357+
358+ /-- **Schwarz reflection for the entire piece `completedRiemannZeta₀`** : for every `s : ℂ`,
359+ `completedRiemannZeta₀ (conj s) = conj (completedRiemannZeta₀ s)`. This is the
360+ conj-equivariance counterpart of the functional equation `completedRiemannZeta₀_one_sub`,
361+ and the analogue of `Complex.Gamma_conj` for the completed zeta. -/
362+ theorem completedRiemannZeta₀_conj (s : ℂ) :
363+ completedRiemannZeta₀ (conj s) = conj (completedRiemannZeta₀ s) := by
364+ suffices h_eq :
365+ (fun z => conj (completedRiemannZeta₀ (conj z))) = completedRiemannZeta₀ by
366+ have := congrFun h_eq (conj s)
367+ rw [Complex.conj_conj] at this
368+ exact this.symm
369+ have hf : AnalyticOnNhd ℂ (fun z => conj (completedRiemannZeta₀ (conj z))) Set.univ :=
370+ fun z _ => differentiable_conj_completedZeta₀_conj.analyticAt z
371+ have hg : AnalyticOnNhd ℂ completedRiemannZeta₀ Set.univ :=
372+ fun z _ => differentiable_completedZeta₀.analyticAt z
373+ have h2 : (2 : ℂ) ∈ {z : ℂ | 1 < re z} := by
374+ rw [Set.mem_setOf_eq, show ((2 : ℂ).re = 2 ) by norm_num]; norm_num
375+ have hopen : IsOpen {z : ℂ | 1 < re z} :=
376+ isOpen_lt continuous_const Complex.continuous_re
377+ refine AnalyticOnNhd.eq_of_eventuallyEq hf hg (z₀ := 2 ) ?_
378+ filter_upwards [hopen.mem_nhds h2] with z hz
379+ have key := completedRiemannZeta₀_conj_of_one_lt_re hz
380+ have := congrArg conj key
381+ rw [Complex.conj_conj] at this
382+ exact this
383+
384+ /-- **Schwarz reflection for the completed Riemann zeta function** : for every `s : ℂ`,
385+ `completedRiemannZeta (conj s) = conj (completedRiemannZeta s)`. This is the
386+ conj-equivariance counterpart of the functional equation `completedRiemannZeta_one_sub`.
387+ The proof reduces to `completedRiemannZeta₀_conj` via the pole-decomposition
388+ `completedRiemannZeta_eq`. -/
389+ theorem completedRiemannZeta_conj (s : ℂ) :
390+ completedRiemannZeta (conj s) = conj (completedRiemannZeta s) := by
391+ rw [completedRiemannZeta_eq (conj s), completedRiemannZeta₀_conj]
392+ rw [completedRiemannZeta_eq s, map_sub, map_sub]
393+ congr 1
394+ · congr 1
395+ rw [map_div₀, map_one]
396+ · rw [map_div₀, map_one, map_sub, map_one]
0 commit comments