1
1
/-
2
2
Copyright (c) 2021 Aaron Anderson. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
- Authors: Aaron Anderson
4
+ Authors: Aaron Anderson, Michael Stoll
5
5
-/
6
- import Mathlib.Analysis.NormedSpace.FiniteDimension
7
6
import Mathlib.Analysis.PSeries
8
7
import Mathlib.NumberTheory.ArithmeticFunction
9
- import Mathlib.Topology.Algebra.InfiniteSum.Basic
8
+ import Mathlib.Analysis.NormedSpace.FiniteDimension
10
9
11
10
#align_import number_theory.l_series from "leanprover-community/mathlib" @"32253a1a1071173b33dc7d6a218cf722c6feb514"
12
11
@@ -16,29 +15,44 @@ import Mathlib.Topology.Algebra.InfiniteSum.Basic
16
15
Given an arithmetic function, we define the corresponding L-series.
17
16
18
17
## Main Definitions
18
+
19
19
* `ArithmeticFunction.LSeries` is the `LSeries` with a given arithmetic function as its
20
20
coefficients. This is not the analytic continuation, just the infinite series.
21
+
21
22
* `ArithmeticFunction.LSeriesSummable` indicates that the `LSeries`
22
23
converges at a given point.
23
24
25
+ * `ArithmeticFunction.LSeriesHasSum f s a` expresses that the L-series
26
+ of `f : ArithmeticFunction ℂ` converges (absolutely) at `s : ℂ` to `a : ℂ`.
27
+
24
28
## Main Results
25
- * `ArithmeticFunction.LSeriesSummable_of_bounded_of_one_lt_real`: the `LSeries` of a bounded
26
- arithmetic function converges when `1 < z.re`.
29
+
30
+ * `ArithmeticFunction.LSeriesSummable_of_le_const_mul_rpow`: the `LSeries` of an
31
+ arithmetic function bounded by a constant times `n^(x-1)` converges at `s` when `x < s.re`.
32
+
27
33
* `ArithmeticFunction.zeta_LSeriesSummable_iff_one_lt_re`: the `LSeries` of `ζ`
28
34
(whose analytic continuation is the Riemann ζ) converges iff `1 < z.re`.
29
35
30
- -/
36
+ ## Tags
37
+
38
+ L-series, abscissa of convergence
31
39
40
+ ## TODO
41
+
42
+ * Move `zeta_LSeriesSummable_iff_one_lt_r` to a new file on L-series of specific functions
43
+
44
+ * Move `LSeries_add` to a new file on algebraic operations on L-series
45
+ -/
32
46
33
- noncomputable section
34
47
35
48
open scoped BigOperators
36
49
37
50
namespace ArithmeticFunction
38
51
39
- open Nat
52
+ open Complex Nat
40
53
41
54
/-- The L-series of an `ArithmeticFunction`. -/
55
+ noncomputable
42
56
def LSeries (f : ArithmeticFunction ℂ) (z : ℂ) : ℂ :=
43
57
∑' n, f n / n ^ z
44
58
#align nat.arithmetic_function.l_series ArithmeticFunction.LSeries
@@ -58,50 +72,136 @@ theorem LSeriesSummable_zero {z : ℂ} : LSeriesSummable 0 z := by
58
72
simp [LSeriesSummable, summable_zero]
59
73
#align nat.arithmetic_function.l_series_summable_zero ArithmeticFunction.LSeriesSummable_zero
60
74
61
- theorem LSeriesSummable_of_bounded_of_one_lt_real {f : ArithmeticFunction ℂ} {m : ℝ}
62
- (h : ∀ n : ℕ, Complex.abs (f n) ≤ m) {z : ℝ} (hz : 1 < z) : f.LSeriesSummable z := by
63
- by_cases h0 : m = 0
64
- · subst h0
65
- have hf : f = 0 := ArithmeticFunction.ext fun n =>
66
- Complex.abs.eq_zero.1 (le_antisymm (h n) (Complex.abs.nonneg _))
67
- simp [hf]
68
- refine' .of_norm_bounded (fun n : ℕ => m / n ^ z) _ _
69
- · simp_rw [div_eq_mul_inv]
70
- exact (summable_mul_left_iff h0).2 (Real.summable_nat_rpow_inv.2 hz)
71
- · intro n
72
- have hm : 0 ≤ m := le_trans (Complex.abs.nonneg _) (h 0 )
73
- cases' n with n
74
- · simp [hm, Real.zero_rpow (_root_.ne_of_gt (lt_trans Real.zero_lt_one hz))]
75
- simp only [map_div₀, Complex.norm_eq_abs]
76
- apply div_le_div hm (h _) (Real.rpow_pos_of_pos (Nat.cast_pos.2 n.succ_pos) _) (le_of_eq _)
77
- rw [Complex.abs_cpow_real, Complex.abs_natCast]
78
- #align nat.arithmetic_function.l_series_summable_of_bounded_of_one_lt_real ArithmeticFunction.LSeriesSummable_of_bounded_of_one_lt_real
75
+ /-- This states that the L-series of the arithmetic function `f` converges at `s` to `a`. -/
76
+ def LSeriesHasSum (f : ArithmeticFunction ℂ) (s a : ℂ) : Prop :=
77
+ HasSum (fun (n : ℕ) => f n / n ^ s) a
78
+
79
+ lemma LSeriesHasSum.LSeriesSummable {f : ArithmeticFunction ℂ} {s a : ℂ}
80
+ (h : LSeriesHasSum f s a) : LSeriesSummable f s :=
81
+ h.summable
82
+
83
+ lemma LSeriesHasSum.LSeries_eq {f : ArithmeticFunction ℂ} {s a : ℂ}
84
+ (h : LSeriesHasSum f s a) : LSeries f s = a :=
85
+ h.tsum_eq
86
+
87
+ lemma LSeriesSummable.LSeriesHasSum {f : ArithmeticFunction ℂ} {s : ℂ} (h : LSeriesSummable f s) :
88
+ LSeriesHasSum f s (LSeries f s) :=
89
+ h.hasSum
90
+
91
+ lemma norm_LSeriesTerm_eq (f : ArithmeticFunction ℂ) (s : ℂ) (n : ℕ) :
92
+ ‖f n / n ^ s‖ = ‖f n‖ / n ^ s.re := by
93
+ rcases n.eq_zero_or_pos with rfl | hn
94
+ · simp only [map_zero, zero_div, norm_zero, zero_mul]
95
+ rw [norm_div, norm_natCast_cpow_of_pos hn]
96
+
97
+ lemma norm_LSeriesTerm_le_of_re_le_re (f : ArithmeticFunction ℂ) {w : ℂ} {z : ℂ}
98
+ (h : w.re ≤ z.re) (n : ℕ) : ‖f n / n ^ z‖ ≤ ‖f n / n ^ w‖ := by
99
+ rcases n.eq_zero_or_pos with rfl | hn
100
+ · simp only [map_zero, CharP.cast_eq_zero, zero_div, norm_zero, le_refl]
101
+ have hn' := norm_natCast_cpow_pos_of_pos hn w
102
+ simp_rw [norm_div]
103
+ suffices H : ‖(n : ℂ) ^ w‖ ≤ ‖(n : ℂ) ^ z‖ from div_le_div (norm_nonneg _) le_rfl hn' H
104
+ refine (one_le_div hn').mp ?_
105
+ rw [← norm_div, ← cpow_sub _ _ <| cast_ne_zero.mpr hn.ne', norm_natCast_cpow_of_pos hn]
106
+ exact Real.one_le_rpow (one_le_cast.mpr hn) <| by simp only [sub_re, sub_nonneg, h]
107
+
108
+ lemma LSeriesSummable.of_re_le_re {f : ArithmeticFunction ℂ} {w : ℂ} {z : ℂ} (h : w.re ≤ z.re)
109
+ (hf : LSeriesSummable f w) : LSeriesSummable f z := by
110
+ rw [LSeriesSummable, ← summable_norm_iff] at hf ⊢
111
+ exact hf.of_nonneg_of_le (fun _ ↦ norm_nonneg _) (norm_LSeriesTerm_le_of_re_le_re f h)
79
112
80
113
theorem LSeriesSummable_iff_of_re_eq_re {f : ArithmeticFunction ℂ} {w z : ℂ} (h : w.re = z.re) :
81
- f.LSeriesSummable w ↔ f.LSeriesSummable z := by
82
- suffices h : ∀ n : ℕ,
83
- Complex.abs (f n) / Complex.abs (↑n ^ w) = Complex.abs (f n) / Complex.abs (↑n ^ z) by
84
- simp [LSeriesSummable, ← summable_norm_iff, h, Complex.norm_eq_abs]
85
- intro n
86
- cases' n with n; · simp
87
- apply congr rfl
88
- have h0 : (n.succ : ℂ) ≠ 0 := by
89
- rw [Ne.def, Nat.cast_eq_zero]
90
- apply n.succ_ne_zero
91
- rw [Complex.cpow_def, Complex.cpow_def, if_neg h0, if_neg h0, Complex.abs_exp_eq_iff_re_eq]
92
- simp only [h, Complex.mul_re, mul_eq_mul_left_iff, sub_right_inj]
93
- right
94
- rw [Complex.log_im, ← Complex.ofReal_nat_cast]
95
- exact Complex.arg_ofReal_of_nonneg (le_of_lt (cast_pos.2 n.succ_pos))
114
+ f.LSeriesSummable w ↔ f.LSeriesSummable z :=
115
+ ⟨fun H ↦ H.of_re_le_re h.le, fun H ↦ H.of_re_le_re h.symm.le⟩
96
116
#align nat.arithmetic_function.l_series_summable_iff_of_re_eq_re ArithmeticFunction.LSeriesSummable_iff_of_re_eq_re
97
117
118
+ lemma LSeriesSummable.le_const_mul_rpow {f : ArithmeticFunction ℂ} {s : ℂ}
119
+ (h : LSeriesSummable f s) : ∃ C, ∀ n, ‖f n‖ ≤ C * n ^ s.re := by
120
+ replace h := h.norm
121
+ by_contra! H
122
+ obtain ⟨n, hn⟩ := H (tsum fun n ↦ ‖f n / n ^ s‖)
123
+ have hn₀ : 0 < n := by
124
+ refine n.eq_zero_or_pos.resolve_left ?_
125
+ rintro rfl
126
+ rw [map_zero, norm_zero, Nat.cast_zero, mul_neg_iff] at hn
127
+ replace hn := hn.resolve_left <| fun hh ↦ hh.2 .not_le <| Real.rpow_nonneg (le_refl 0 ) s.re
128
+ exact hn.1 .not_le <| tsum_nonneg (fun _ ↦ norm_nonneg _)
129
+ have := le_tsum h n fun _ _ ↦ norm_nonneg _
130
+ rw [norm_LSeriesTerm_eq, div_le_iff <| Real.rpow_pos_of_pos (Nat.cast_pos.mpr hn₀) _] at this
131
+ exact (this.trans_lt hn).false .elim
132
+
133
+ open Filter in
134
+ lemma LSeriesSummable.isBigO_rpow {f : ArithmeticFunction ℂ} {s : ℂ}
135
+ (h : LSeriesSummable f s) : f =O[atTop] fun n ↦ (n : ℝ) ^ s.re := by
136
+ obtain ⟨C, hC⟩ := h.le_const_mul_rpow
137
+ refine Asymptotics.IsBigO.of_bound C ?_
138
+ convert eventually_of_forall hC using 4 with n
139
+ have hn₀ : (0 : ℝ) ≤ n := Nat.cast_nonneg _
140
+ rw [Real.norm_eq_abs, Real.abs_rpow_of_nonneg hn₀, _root_.abs_of_nonneg hn₀]
141
+
142
+ lemma LSeriesSummable_of_le_const_mul_rpow {f : ArithmeticFunction ℂ} {x : ℝ} {s : ℂ}
143
+ (hs : x < s.re) (h : ∃ C, ∀ n, ‖f n‖ ≤ C * n ^ (x - 1 )) :
144
+ LSeriesSummable f s := by
145
+ obtain ⟨C, hC⟩ := h
146
+ have hC₀ : 0 ≤ C := by
147
+ specialize hC 1
148
+ simp only [cast_one, Real.one_rpow, mul_one] at hC
149
+ exact (norm_nonneg _).trans hC
150
+ have hsum : Summable fun n : ℕ ↦ ‖(C : ℂ) / n ^ (s + (1 - x))‖ := by
151
+ simp_rw [div_eq_mul_inv, norm_mul, ← cpow_neg]
152
+ have hsx : -s.re + x - 1 < -1 := by linarith only [hs]
153
+ refine Summable.mul_left _ <|
154
+ Summable.of_norm_bounded_eventually_nat (fun n ↦ (n : ℝ) ^ (-s.re + x - 1 )) ?_ ?_
155
+ · simp only [Real.summable_nat_rpow, hsx]
156
+ · simp only [neg_add_rev, neg_sub, norm_norm, Filter.eventually_atTop]
157
+ refine ⟨1 , fun n hn ↦ ?_⟩
158
+ simp only [norm_natCast_cpow_of_pos hn, add_re, sub_re, neg_re, ofReal_re, one_re]
159
+ convert le_refl ?_ using 2
160
+ ring
161
+ refine Summable.of_norm <| hsum.of_nonneg_of_le (fun _ ↦ norm_nonneg _) (fun n ↦ ?_)
162
+ rcases n.eq_zero_or_pos with rfl | hn
163
+ · simp only [map_zero, zero_div, norm_zero, norm_nonneg]
164
+ have hn' : 0 < (n : ℝ) ^ s.re := Real.rpow_pos_of_pos (Nat.cast_pos.mpr hn) _
165
+ simp_rw [norm_div, norm_natCast_cpow_of_pos hn, div_le_iff hn', add_re, sub_re, one_re,
166
+ ofReal_re, Real.rpow_add <| Nat.cast_pos.mpr hn, div_eq_mul_inv, mul_inv]
167
+ rw [mul_assoc, mul_comm _ ((n : ℝ) ^ s.re), ← mul_assoc ((n : ℝ) ^ s.re), mul_inv_cancel hn'.ne',
168
+ ← Real.rpow_neg n.cast_nonneg, norm_eq_abs (C : ℂ), abs_ofReal, _root_.abs_of_nonneg hC₀,
169
+ neg_sub, one_mul]
170
+ exact hC n
171
+
172
+ open Filter Finset Real Nat in
173
+ lemma LSeriesSummable_of_isBigO_rpow {f : ArithmeticFunction ℂ} {x : ℝ} {s : ℂ}
174
+ (hs : x < s.re) (h : f =O[atTop] fun n ↦ (n : ℝ) ^ (x - 1 )) :
175
+ LSeriesSummable f s := by
176
+ obtain ⟨C, hC⟩ := Asymptotics.isBigO_iff.mp h
177
+ obtain ⟨m, hm⟩ := eventually_atTop.mp hC
178
+ let C' := max C (max' (insert 0 (image (fun n : ℕ ↦ ‖f n‖ / (n : ℝ) ^ (x - 1 )) (range m)))
179
+ (insert_nonempty 0 _))
180
+ have hC'₀ : 0 ≤ C' := (le_max' _ _ (mem_insert.mpr (Or.inl rfl))).trans <| le_max_right ..
181
+ have hCC' : C ≤ C' := le_max_left ..
182
+ refine LSeriesSummable_of_le_const_mul_rpow hs ⟨C', fun n ↦ ?_⟩
183
+ rcases le_or_lt m n with hn | hn
184
+ · refine (hm n hn).trans ?_
185
+ have hn₀ : (0 : ℝ) ≤ n := cast_nonneg _
186
+ gcongr
187
+ rw [Real.norm_eq_abs, abs_rpow_of_nonneg hn₀, _root_.abs_of_nonneg hn₀]
188
+ · rcases n.eq_zero_or_pos with rfl | hn'
189
+ · simpa only [map_zero, norm_zero, cast_zero] using mul_nonneg hC'₀ <| zero_rpow_nonneg _
190
+ refine (div_le_iff <| rpow_pos_of_pos (cast_pos.mpr hn') _).mp ?_
191
+ refine (le_max' _ _ <| mem_insert_of_mem ?_).trans <| le_max_right ..
192
+ exact mem_image.mpr ⟨n, mem_range.mpr hn, rfl⟩
193
+
98
194
theorem LSeriesSummable_of_bounded_of_one_lt_re {f : ArithmeticFunction ℂ} {m : ℝ}
99
195
(h : ∀ n : ℕ, Complex.abs (f n) ≤ m) {z : ℂ} (hz : 1 < z.re) : f.LSeriesSummable z := by
100
- rw [← LSeriesSummable_iff_of_re_eq_re (Complex.ofReal_re z.re)]
101
- apply LSeriesSummable_of_bounded_of_one_lt_real h
102
- exact hz
196
+ refine LSeriesSummable_of_le_const_mul_rpow hz ⟨m, fun n ↦ ?_⟩
197
+ simp only [norm_eq_abs, sub_self, Real.rpow_zero, mul_one, h n]
103
198
#align nat.arithmetic_function.l_series_summable_of_bounded_of_one_lt_re ArithmeticFunction.LSeriesSummable_of_bounded_of_one_lt_re
104
199
200
+ theorem LSeriesSummable_of_bounded_of_one_lt_real {f : ArithmeticFunction ℂ} {m : ℝ}
201
+ (h : ∀ n : ℕ, Complex.abs (f n) ≤ m) {z : ℝ} (hz : 1 < z) : f.LSeriesSummable z :=
202
+ LSeriesSummable_of_bounded_of_one_lt_re h <| by simp only [ofReal_re, hz]
203
+ #align nat.arithmetic_function.l_series_summable_of_bounded_of_one_lt_real ArithmeticFunction.LSeriesSummable_of_bounded_of_one_lt_real
204
+
105
205
open scoped ArithmeticFunction
106
206
107
207
theorem zeta_LSeriesSummable_iff_one_lt_re {z : ℂ} : LSeriesSummable ζ z ↔ 1 < z.re := by
0 commit comments