Skip to content

Commit d52548d

Browse files
committed
feat(NumberTheory/LSeries): add completedRiemannZeta_conj
Adds Schwarz reflection / conjugation symmetry for the completed Riemann zeta function and its entire piece: theorem completedRiemannZeta_conj (s : ℂ) : completedRiemannZeta (conj s) = conj (completedRiemannZeta s) theorem completedRiemannZeta₀_conj (s : ℂ) : completedRiemannZeta₀ (conj s) = conj (completedRiemannZeta₀ s) These are the conj-equivariance analogues of the functional equation lemmas `completedRiemannZeta_one_sub` and `completedRiemannZeta₀_one_sub` already in this file, and they mirror `Complex.Gamma_conj` for `Λ`. The proof proceeds in two steps: * On `{Re s > 1}` the Dirichlet series for `Λ` converges absolutely and conjugation commutes term-by-term with the series, with `Complex.Gamma_conj`, and with `cpow` of positive real bases `π` and `n : ℕ` (via `Complex.conj_cpow`). * Both sides extend to entire functions of `s`; the identity principle `AnalyticOnNhd.eq_of_eventuallyEq` propagates the equality from `{Re s > 1}` to all of `ℂ`. The pole-decomposition `completedRiemannZeta_eq` transfers the result from `Λ₀` to the full `Λ`. New imports: `Mathlib.Analysis.Calculus.Deriv.Star` (for `DifferentiableAt.conj_conj`) and `Mathlib.Analysis.Analytic.Uniqueness` (for `AnalyticOnNhd.eq_of_eventuallyEq`). Five `private lemma` helpers encapsulate the per-factor conjugation computations (`conj_natCast_cpow`, `conj_pi_cpow`, `completedRiemannZeta_conj_of_one_lt_re`, `completedRiemannZeta₀_conj_of_one_lt_re`, `differentiable_conj_completedZeta₀_conj`). The two public theorems are intended downstream consumption: they appear in third-party formalisations involving real-valuedness of `Λ` (and the Hardy `Ξ`-function) on the critical line. Signed-off-by: sluvec <slawomir.pawlikiewicz@gmail.com>
1 parent 50622aa commit d52548d

1 file changed

Lines changed: 152 additions & 1 deletion

File tree

Mathlib/NumberTheory/LSeries/RiemannZeta.lean

Lines changed: 152 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ module
77

88
public import Mathlib.NumberTheory.LSeries.HurwitzZeta
99
public 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
3842
see `Mathlib/NumberTheory/LSeries/HurwitzZetaValues.lean`. For computation of the constant term as
@@ -51,7 +55,7 @@ open CharZero Set Filter HurwitzZeta
5155

5256
open Complex hiding exp continuous_exp
5357

54-
open scoped Topology Real
58+
open scoped Topology Real ComplexConjugate
5559

5660
noncomputable 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

Comments
 (0)