1 (* ========================================================================= *)
2 (* "Second proof" of Prime Number Theorem from Newman's book. *)
3 (* ========================================================================= *)
5 needs "Multivariate/cauchy.ml";;
6 needs "Library/pocklington.ml";;
7 needs "Examples/mangoldt.ml";;
10 prioritize_complex();;
12 (* ------------------------------------------------------------------------- *)
13 (* A few miscelleneous lemmas. *)
14 (* ------------------------------------------------------------------------- *)
16 let LT_NORM_CPOW_NUM = prove
17 (`!n s. &0 < Re s /\ 2 <= n ==> &1 < norm(Cx(&n) cpow s)`,
18 SIMP_TAC[NORM_CPOW_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT;
19 ARITH_RULE `2 <= n ==> 0 < n`] THEN
20 REWRITE_TAC[GSYM REAL_EXP_0; REAL_EXP_MONO_LT] THEN
21 SIMP_TAC[REAL_LT_MUL; LOG_POS_LT; REAL_OF_NUM_LT;
22 ARITH_RULE `2 <= n ==> 1 < n`]);;
24 let CPOW_NUM_NE_1 = prove
25 (`!n s. &0 < Re s /\ 2 <= n ==> ~(Cx(&n) cpow s = Cx(&1))`,
27 FIRST_X_ASSUM(MP_TAC o SYM o AP_TERM `norm:complex->real`) THEN
28 ASM_SIMP_TAC[LT_NORM_CPOW_NUM; COMPLEX_NORM_CX; REAL_ABS_NUM;
31 let FINITE_ATMOST = prove
32 (`!P n. FINITE {m:num | P m /\ m <= n}`,
34 MATCH_MP_TAC FINITE_SUBSET THEN EXISTS_TAC `0..n` THEN
35 SIMP_TAC[LE_0; FINITE_NUMSEG; SUBSET; IN_ELIM_THM; IN_NUMSEG]);;
37 let PRIME_ATMOST_ALT = prove
38 (`{p | prime p /\ p <= n} = {p | p IN 1..n /\ prime p}`,
39 REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_NUMSEG] THEN
40 X_GEN_TAC `p:num` THEN ASM_CASES_TAC `prime p` THEN ASM_REWRITE_TAC[] THEN
41 FIRST_ASSUM(MP_TAC o MATCH_MP PRIME_IMP_NZ) THEN ARITH_TAC);;
43 (* ------------------------------------------------------------------------- *)
44 (* An auxiliary zeta function that's analytic in the right halfplane. *)
45 (* ------------------------------------------------------------------------- *)
47 let nearzeta = new_definition
48 `nearzeta n s = infsum (from n)
49 (\m. (s - Cx(&1)) / Cx(&m) cpow s -
50 (Cx(&1) / Cx(&m) cpow (s - Cx(&1)) -
51 Cx(&1) / Cx(&(m+1)) cpow (s - Cx(&1))))`;;
53 (* ------------------------------------------------------------------------- *)
54 (* The actual zeta function, with analyticity of z_n(s) - 1/(s - 1)^{n-1} *)
55 (* ------------------------------------------------------------------------- *)
57 let genzeta = new_definition
58 `genzeta n s = if s = Cx(&1) then complex_derivative (nearzeta n) (Cx(&1))
59 else (nearzeta n s + Cx(&1) / Cx(&n) cpow (s - Cx(&1))) /
62 let zeta = new_definition
63 `zeta s = genzeta 1 s`;;
65 (* ------------------------------------------------------------------------- *)
66 (* Lemmas about convergence and analyticity of the series. *)
67 (* ------------------------------------------------------------------------- *)
69 let NEARZETA_BOUND_LEMMA = prove
70 (`!s n. ~(n = 0) /\ &0 <= Re s + &1
71 ==> norm((s - Cx(&1)) / Cx(&n) cpow s -
72 (Cx(&1) / Cx(&n) cpow (s - Cx(&1)) -
73 Cx(&1) / Cx(&(n + 1)) cpow (s - Cx(&1)))) <=
74 norm(s * (s - Cx(&1)) / Cx(&n) cpow (s + Cx(&1)))`,
75 REPEAT STRIP_TAC THEN MP_TAC(ISPECL
76 [`\n z. if n = 0 then Cx(&1) / z cpow (s - Cx(&1))
77 else if n = 1 then (Cx(&1) - s) / z cpow s
78 else s * (s - Cx(&1)) / z cpow (s + Cx(&1))`;
79 `1`; `segment[Cx(&n),Cx(&n) + Cx(&1)]`;
80 `norm(s * (s - Cx (&1)) / Cx(&n) cpow (s + Cx(&1)))`] COMPLEX_TAYLOR) THEN
81 REWRITE_TAC[ARITH] THEN ANTS_TAC THENL
82 [REWRITE_TAC[CONVEX_SEGMENT] THEN CONJ_TAC THENL
83 [MAP_EVERY X_GEN_TAC [`i:num`; `z:complex`] THEN STRIP_TAC;
84 X_GEN_TAC `z:complex` THEN DISCH_TAC] THEN
85 (SUBGOAL_THEN `&0 < Re z` ASSUME_TAC THENL
86 [MATCH_MP_TAC RE_POS_SEGMENT THEN
87 MAP_EVERY EXISTS_TAC [`Cx(&n)`; `Cx(&n) + Cx(&1)`] THEN
88 ASM_REWRITE_TAC[RE_ADD; RE_CX; REAL_OF_NUM_ADD; REAL_OF_NUM_LT] THEN
91 SUBGOAL_THEN `~(z = Cx(&0))` ASSUME_TAC THENL
92 [DISCH_THEN SUBST_ALL_TAC THEN ASM_MESON_TAC[RE_CX; REAL_LT_REFL];
95 [FIRST_X_ASSUM(DISJ_CASES_THEN SUBST_ALL_TAC o MATCH_MP
96 (ARITH_RULE `i <= 1 ==> i = 0 \/ i = 1`)) THEN
97 ASM_REWRITE_TAC[ARITH] THEN COMPLEX_DIFF_TAC THEN
98 ASM_REWRITE_TAC[CPOW_EQ_0] THEN
99 SIMP_TAC[COMPLEX_POW_2; CPOW_ADD; CPOW_SUB; CPOW_N; COMPLEX_POW_1] THEN
100 (SUBGOAL_THEN `~(z cpow s = Cx(&0))` MP_TAC THENL
101 [ASM_REWRITE_TAC[CPOW_EQ_0]; UNDISCH_TAC `~(z = Cx(&0))`]) THEN
102 CONV_TAC COMPLEX_FIELD;
104 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_POW] THEN
105 REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN
106 MATCH_MP_TAC REAL_LE_LMUL THEN SIMP_TAC[REAL_LE_MUL; NORM_POS_LE] THEN
107 MATCH_MP_TAC REAL_LE_INV2 THEN
108 ASM_REWRITE_TAC[COMPLEX_NORM_NZ; CPOW_EQ_0; CX_INJ; REAL_OF_NUM_EQ] THEN
109 SUBGOAL_THEN `real z` ASSUME_TAC THENL
110 [MATCH_MP_TAC REAL_SEGMENT THEN
111 MAP_EVERY EXISTS_TAC [`Cx(&n)`; `Cx(&n) + Cx(&1)`] THEN
112 ASM_SIMP_TAC[REAL_CX; REAL_ADD];
114 ASM_SIMP_TAC[NORM_CPOW_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT; LT_NZ] THEN
115 REWRITE_TAC[REAL_EXP_MONO_LE] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
116 ASM_REWRITE_TAC[RE_ADD; RE_CX] THEN
117 ONCE_REWRITE_TAC[GSYM REAL_EXP_MONO_LE] THEN
118 ASM_SIMP_TAC[EXP_LOG; REAL_OF_NUM_LT; LT_NZ] THEN
119 UNDISCH_TAC `z IN segment[Cx (&n),Cx (&n) + Cx (&1)]` THEN
120 REWRITE_TAC[segment; IN_ELIM_THM] THEN
121 STRIP_TAC THEN ASM_REWRITE_TAC[RE_CMUL; RE_ADD; RE_CX] THEN
122 UNDISCH_TAC `&0 <= u` THEN REAL_ARITH_TAC;
124 REWRITE_TAC[NUMSEG_CONV `0..1`] THEN
125 SIMP_TAC[VSUM_CLAUSES; FINITE_INSERT; FINITE_RULES] THEN
126 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; ARITH] THEN
127 CONV_TAC NUM_REDUCE_CONV THEN
128 REWRITE_TAC[complex_pow; COMPLEX_POW_1; COMPLEX_DIV_1; COMPLEX_MUL_RID] THEN
129 DISCH_THEN(MP_TAC o SPECL [`Cx(&n)`; `Cx(&n) + Cx(&1)`]) THEN
130 REWRITE_TAC[ENDS_IN_SEGMENT; COMPLEX_NORM_CX; COMPLEX_ADD_SUB] THEN
131 REWRITE_TAC[VECTOR_ADD_RID; COMPLEX_MUL_LID] THEN
132 REWRITE_TAC[REAL_ABS_NUM; REAL_POW_ONE; REAL_DIV_1; REAL_MUL_RID] THEN
133 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
134 REWRITE_TAC[GSYM REAL_OF_NUM_ADD; CX_ADD; complex_div] THEN
135 CONV_TAC COMPLEX_RING);;
137 let NORM_CPOW_LOWERBOUND = prove
138 (`!m s n. &m <= Re s /\ ~(n = 0) ==> &n pow m <= norm(Cx(&n) cpow s)`,
139 REPEAT STRIP_TAC THEN
140 ASM_SIMP_TAC[NORM_CPOW_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT; LT_NZ] THEN
141 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `exp(&m * log(&n))` THEN
143 [ASM_SIMP_TAC[REAL_EXP_N; EXP_LOG; REAL_OF_NUM_LT; LT_NZ; REAL_LE_REFL];
144 REWRITE_TAC[REAL_EXP_MONO_LE] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
145 ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[GSYM REAL_EXP_MONO_LE] THEN
146 ASM_SIMP_TAC[REAL_EXP_0; EXP_LOG; REAL_OF_NUM_LT; LT_NZ] THEN
147 SIMP_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC]);;
149 let ZETATERM_BOUND = prove
150 (`!s n m. &m <= Re s /\ ~(n = 0)
151 ==> norm(Cx(&1) / Cx(&n) cpow s) <= inv(&n pow m)`,
152 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
153 REWRITE_TAC[real_div; REAL_MUL_LID] THEN REPEAT STRIP_TAC THEN
154 MATCH_MP_TAC REAL_LE_INV2 THEN
155 ASM_SIMP_TAC[REAL_POW_LT; NORM_CPOW_LOWERBOUND; REAL_OF_NUM_LT; LT_NZ]);;
157 let ZETA_CONVERGES_LEMMA = prove
158 (`!n s. &2 <= Re s ==> summable (from n) (\m. Cx(&1) / Cx(&m) cpow s)`,
159 REPEAT STRIP_TAC THEN REWRITE_TAC[summable] THEN
160 MATCH_MP_TAC SERIES_COMPARISON THEN
161 EXISTS_TAC `\n. inv(&n - &1) - inv(&(n + 1) - &1)` THEN CONJ_TAC THENL
162 [EXISTS_TAC `lift(inv(&n - &1))` THEN
163 MP_TAC(ISPECL [`\n. lift(inv(&n - &1))`; `n:num`] SERIES_DIFFS) THEN
164 REWRITE_TAC[o_DEF; LIFT_SUB] THEN DISCH_THEN MATCH_MP_TAC THEN
165 MATCH_MP_TAC SEQ_OFFSET_REV THEN EXISTS_TAC `1` THEN
166 REWRITE_TAC[GSYM REAL_OF_NUM_ADD; REAL_ARITH `(x + &1) - &1 = x`] THEN
167 REWRITE_TAC[SEQ_HARMONIC];
169 EXISTS_TAC `2` THEN REWRITE_TAC[GE; IN_FROM] THEN X_GEN_TAC `m:num` THEN
170 STRIP_TAC THEN ASM_SIMP_TAC[GSYM REAL_OF_NUM_ADD; REAL_OF_NUM_LE; REAL_FIELD
171 `&2 <= x ==> inv(x - &1) - inv((x + &1) - &1) = inv(x * (x - &1))`] THEN
172 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
173 REWRITE_TAC[real_div; REAL_MUL_LID] THEN
174 MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL
175 [MATCH_MP_TAC REAL_LT_MUL THEN REPEAT(POP_ASSUM MP_TAC) THEN
176 REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN REAL_ARITH_TAC;
178 MATCH_MP_TAC(REAL_ARITH `&n pow 2 <= x ==> &n * (&n - &1) <= x`) THEN
179 MATCH_MP_TAC NORM_CPOW_LOWERBOUND THEN ASM_REWRITE_TAC[] THEN
182 let ZETADIFF_CONVERGES = prove
184 ==> ((\m. Cx(&1) / Cx(&m) cpow s - Cx(&1) / Cx(&(m + 1)) cpow s)
185 sums Cx(&1) / Cx(&n) cpow s) (from n)`,
186 REPEAT STRIP_TAC THEN
187 MP_TAC(ISPECL [`\m. Cx(&1) / Cx(&m) cpow s`; `n:num`] SERIES_DIFFS) THEN
188 REWRITE_TAC[CPOW_1; COMPLEX_DIV_1] THEN DISCH_THEN MATCH_MP_TAC THEN
189 ONCE_REWRITE_TAC[LIM_NULL_NORM] THEN
190 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
191 MATCH_MP_TAC LIM_TRANSFORM THEN
192 EXISTS_TAC `\n. lift(&1 / exp (Re s * log (&n)))` THEN CONJ_TAC THENL
193 [MATCH_MP_TAC LIM_EVENTUALLY THEN REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
194 EXISTS_TAC `1` THEN REPEAT STRIP_TAC THEN
195 ASM_SIMP_TAC[NORM_CPOW_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT;
196 VECTOR_SUB_REFL; LE_1];
198 MATCH_MP_TAC LIM_NULL_COMPARISON THEN
199 EXISTS_TAC `\n. &1 / (Re s * log(&n))` THEN CONJ_TAC THENL
200 [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `2` THEN
201 REPEAT STRIP_TAC THEN REWRITE_TAC[NORM_LIFT] THEN
202 REWRITE_TAC[REAL_ABS_INV; REAL_ABS_EXP; real_div; REAL_MUL_LID] THEN
203 MATCH_MP_TAC REAL_LE_INV2 THEN MATCH_MP_TAC(REAL_ARITH
204 `&0 < x /\ (&0 <= x ==> &1 + u <= v) ==> &0 < x /\ u <= v`) THEN
205 REWRITE_TAC[REAL_EXP_LE_X] THEN
206 ASM_SIMP_TAC[LOG_POS_LT; REAL_LT_MUL; REAL_OF_NUM_LT;
207 ARITH_RULE `2 <= n ==> 1 < n`];
209 REWRITE_TAC[LIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN STRIP_TAC THEN
210 MP_TAC(SPEC `exp(inv(Re s * e))` (MATCH_MP REAL_ARCH REAL_LT_01)) THEN
211 REWRITE_TAC[REAL_MUL_RID] THEN DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN
212 EXISTS_TAC `N + 2` THEN X_GEN_TAC `n:num` THEN STRIP_TAC THEN
213 REWRITE_TAC[dist; VECTOR_SUB_RZERO; NORM_LIFT] THEN
214 SUBGOAL_THEN `&0 < log(&n)` ASSUME_TAC THENL
215 [MATCH_MP_TAC LOG_POS_LT THEN REWRITE_TAC[REAL_OF_NUM_LT] THEN
216 UNDISCH_TAC `N + 2 <= n` THEN ARITH_TAC;
218 ASM_SIMP_TAC[REAL_ABS_DIV; REAL_ABS_NUM; REAL_ABS_MUL;
219 REAL_ARITH `&0 < x ==> abs x = x`] THEN
220 REWRITE_TAC[real_div; REAL_INV_MUL] THEN REWRITE_TAC[GSYM real_div] THEN
221 ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_MUL_LID] THEN
222 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
223 ASM_SIMP_TAC[GSYM REAL_LT_LDIV_EQ] THEN
224 ONCE_REWRITE_TAC[GSYM REAL_EXP_MONO_LT] THEN
225 ASM_REWRITE_TAC[real_div; GSYM REAL_INV_MUL] THEN
226 MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `&N` THEN
227 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
228 EXISTS_TAC `&n` THEN ASM_SIMP_TAC[REAL_OF_NUM_LE] THEN
229 ASM_SIMP_TAC[ARITH_RULE `N + 2 <= n ==> N <= n`] THEN
230 MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN
231 MATCH_MP_TAC EXP_LOG THEN REWRITE_TAC[REAL_OF_NUM_LT] THEN
234 let NEARZETA_CONVERGES_LEMMA = prove
236 ==> ((\m. (s - Cx(&1)) / Cx(&m) cpow s -
237 (Cx(&1) / Cx(&m) cpow (s - Cx(&1)) -
238 Cx(&1) / Cx(&(m + 1)) cpow (s - Cx(&1))))
239 sums nearzeta n s) (from n)`,
240 REPEAT STRIP_TAC THEN REWRITE_TAC[nearzeta; SUMS_INFSUM] THEN
241 REWRITE_TAC[summable] THEN MATCH_MP_TAC SERIES_COMPARISON THEN
242 EXISTS_TAC `\m. norm(s * (s - Cx(&1)) / Cx(&m) cpow (s + Cx(&1)))` THEN
246 ASM_SIMP_TAC[IN_FROM; GE; LE_1; NEARZETA_BOUND_LEMMA;
247 REAL_ARITH `&1 <= s ==> &0 <= s + &1`]] THEN
250 (\m. lift(((Cx (norm s) * Cx (norm (s - Cx (&1)))) *
251 Cx (&1) / Cx (&m) cpow Cx (Re s + &1))$1))`
253 [MATCH_MP_TAC SUMMABLE_COMPONENT THEN REWRITE_TAC[DIMINDEX_2; ARITH] THEN
254 MATCH_MP_TAC SUMMABLE_COMPLEX_LMUL THEN
255 MATCH_MP_TAC ZETA_CONVERGES_LEMMA THEN
256 REWRITE_TAC[RE_CX] THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
258 REWRITE_TAC[GSYM summable] THEN MATCH_MP_TAC EQ_IMP THEN
259 MATCH_MP_TAC SUMMABLE_IFF_EVENTUALLY THEN EXISTS_TAC `1` THEN
260 X_GEN_TAC `m:num` THEN REWRITE_TAC[IN_FROM; o_THM] THEN DISCH_TAC THEN
261 AP_TERM_TAC THEN REWRITE_TAC[GSYM RE_DEF] THEN
262 REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; RE_MUL_CX; complex_div] THEN
263 REWRITE_TAC[COMPLEX_NORM_MUL; REAL_MUL_LID; COMPLEX_NORM_INV] THEN
264 AP_TERM_TAC THEN AP_TERM_TAC THEN
265 ASM_SIMP_TAC[NORM_CPOW_REAL; CPOW_REAL_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT;
267 REWRITE_TAC[GSYM CX_INV; RE_CX; RE_ADD]);;
269 let GENZETA_CONVERGES = prove
271 ==> ((\m. Cx(&1) / Cx(&m) cpow s) sums genzeta n s) (from n)`,
272 REPEAT STRIP_TAC THEN
273 FIRST_ASSUM(MP_TAC o SPEC `n:num` o MATCH_MP NEARZETA_CONVERGES_LEMMA o
274 MATCH_MP REAL_LT_IMP_LE) THEN
275 MP_TAC(SPECL [`n:num`; `s - Cx(&1)`] ZETADIFF_CONVERGES) THEN ANTS_TAC THENL
276 [REWRITE_TAC[RE_SUB; RE_CX] THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
278 REWRITE_TAC[IMP_IMP] THEN DISCH_THEN(MP_TAC o MATCH_MP SERIES_ADD) THEN
279 REWRITE_TAC[COMPLEX_RING `a + (b - a) = b:complex`; genzeta] THEN
281 [UNDISCH_TAC `&1 < Re s` THEN ASM_REWRITE_TAC[RE_CX] THEN REAL_ARITH_TAC;
283 DISCH_THEN(MP_TAC o SPEC `inv(s - Cx(&1))` o
284 MATCH_MP SERIES_COMPLEX_LMUL) THEN
285 SUBGOAL_THEN `~(s - Cx(&1) = Cx(&0))` ASSUME_TAC THENL
286 [REWRITE_TAC[COMPLEX_SUB_0] THEN DISCH_THEN SUBST_ALL_TAC THEN
287 POP_ASSUM MP_TAC THEN REWRITE_TAC[RE_CX] THEN REAL_ARITH_TAC;
289 ASM_SIMP_TAC[complex_div; COMPLEX_MUL_ASSOC; COMPLEX_MUL_LINV] THEN
290 REWRITE_TAC[COMPLEX_MUL_AC; COMPLEX_ADD_AC]);;
292 let ZETA_CONVERGES = prove
294 ==> ((\n. Cx(&1) / Cx(&n) cpow s) sums zeta(s)) (from 1)`,
295 REWRITE_TAC[zeta; GENZETA_CONVERGES]);;
297 (* ------------------------------------------------------------------------- *)
298 (* We need the series for the derivative at one stage, so do this now. *)
299 (* ------------------------------------------------------------------------- *)
301 let COMPLEX_DERIVATIVE_ZETA_CONVERGES = prove
303 ==> ((\n. --clog(Cx(&n)) / Cx(&n) cpow s) sums
304 complex_derivative zeta s) (from 1)`,
305 REPEAT STRIP_TAC THEN
307 [`\n z. Cx(&1) / Cx(&n) cpow z`;
308 `\n z. --clog(Cx(&n)) / Cx(&n) cpow z`;
311 SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX) THEN
312 REWRITE_TAC[OPEN_HALFSPACE_RE_GT; IN_ELIM_THM] THEN ANTS_TAC THENL
314 [REWRITE_TAC[IN_FROM] THEN REPEAT STRIP_TAC THEN COMPLEX_DIFF_TAC THEN
315 MATCH_MP_TAC(TAUT `(a ==> b) /\ a ==> a /\ b`) THEN
316 CONJ_TAC THENL [CONV_TAC COMPLEX_FIELD; ALL_TAC] THEN
317 ASM_SIMP_TAC[CPOW_EQ_0; CX_INJ; REAL_OF_NUM_EQ; LE_1];
319 POP_ASSUM(K ALL_TAC) THEN
320 X_GEN_TAC `z:complex` THEN REWRITE_TAC[real_gt] THEN STRIP_TAC THEN
323 `\n. Cx(&1) / Cx(&n) cpow (Cx(&1 + (Re z - &1) / &2))`;
325 ASM_SIMP_TAC[REAL_HALF; REAL_SUB_LT] THEN CONJ_TAC THENL
326 [MP_TAC(SPEC `Cx(&1 + (Re z - &1) / &2)` ZETA_CONVERGES) THEN
327 ANTS_TAC THENL [REWRITE_TAC[RE_CX] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
330 ASM_SIMP_TAC[IN_FROM; CPOW_REAL_REAL; REAL_OF_NUM_LT; RE_CX; REAL_CX;
331 LE_1; COMPLEX_NORM_DIV; NORM_CPOW_REAL] THEN
332 REWRITE_TAC[GSYM CX_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM; REAL_CX; RE_CX;
333 real_div; REAL_MUL_LID; REAL_LE_INV_EQ; REAL_EXP_POS_LE] THEN
334 REWRITE_TAC[REAL_ABS_EXP; GSYM REAL_EXP_NEG; REAL_EXP_MONO_LE] THEN
335 REPEAT STRIP_TAC THEN
336 REWRITE_TAC[REAL_ARITH `--(a * x) <= --(b * x) <=> b * x <= a * x`] THEN
337 MATCH_MP_TAC REAL_LE_RMUL THEN ASM_SIMP_TAC[LOG_POS; REAL_OF_NUM_LE] THEN
338 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_BALL]) THEN
339 MP_TAC(SPEC `z - y:complex` COMPLEX_NORM_GE_RE_IM) THEN
340 REWRITE_TAC[RE_SUB] THEN ASM_NORM_ARITH_TAC;
342 REWRITE_TAC[LEFT_IMP_EXISTS_THM; real_gt] THEN
343 MAP_EVERY X_GEN_TAC [`f:complex->complex`; `g:complex->complex`] THEN
345 FIRST_ASSUM(MP_TAC o SPEC `s:complex`) THEN SIMP_TAC[ASSUME `&1 < Re s`] THEN
346 DISCH_THEN(MP_TAC o CONJUNCT1 o CONJUNCT2) THEN
347 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
348 CONV_TAC SYM_CONV THEN MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
349 FIRST_ASSUM(MP_TAC o SPEC `s:complex`) THEN SIMP_TAC[ASSUME `&1 < Re s`] THEN
350 DISCH_THEN(MP_TAC o CONJUNCT2 o CONJUNCT2) THEN
351 MATCH_MP_TAC(REWRITE_RULE[TAUT `b /\ c /\ d ==> e <=> b /\ c ==> d ==> e`]
352 HAS_COMPLEX_DERIVATIVE_TRANSFORM_AT) THEN
353 EXISTS_TAC `Re s - &1` THEN ASM_REWRITE_TAC[REAL_SUB_LT] THEN
354 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN MATCH_MP_TAC SERIES_UNIQUE THEN
355 MAP_EVERY EXISTS_TAC [`\n. Cx(&1) / Cx(&n) cpow z`; `from 1`] THEN
356 SUBGOAL_THEN `&1 < Re z` (fun th -> ASM_SIMP_TAC[th; ZETA_CONVERGES]) THEN
357 MP_TAC(SPEC `z - s:complex` COMPLEX_NORM_GE_RE_IM) THEN
358 REWRITE_TAC[RE_SUB] THEN ASM_NORM_ARITH_TAC);;
360 (* ------------------------------------------------------------------------- *)
361 (* The zeta function is actually analytic on a larger set. *)
362 (* ------------------------------------------------------------------------- *)
364 let HOLOMORPHIC_NEARZETA_LEMMA = prove
366 ==> ?g g'. !s. s IN {s | Re(s) > &0}
367 ==> ((\m. (s - Cx(&1)) / Cx(&m) cpow s -
368 (Cx(&1) / Cx(&m) cpow (s - Cx(&1)) -
369 Cx(&1) / Cx(&(m + 1)) cpow (s - Cx(&1))))
370 sums g s) (from n) /\
371 ((\m. (Cx(&1) - (s - Cx(&1)) * clog(Cx(&m))) /
373 (clog(Cx(&(m + 1))) /
374 Cx(&(m + 1)) cpow (s - Cx(&1)) -
376 Cx(&m) cpow (s - Cx(&1))))
377 sums g' s) (from n) /\
378 (g has_complex_derivative g' s) (at s)`,
379 GEN_TAC THEN DISCH_TAC THEN
380 MATCH_MP_TAC SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX THEN
381 REWRITE_TAC[OPEN_HALFSPACE_RE_GT] THEN CONJ_TAC THENL
382 [MAP_EVERY X_GEN_TAC [`m:num`; `s:complex`] THEN
383 REWRITE_TAC[IN_ELIM_THM; real_gt; from] THEN STRIP_TAC THEN
384 COMPLEX_DIFF_TAC THEN MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN
385 CONJ_TAC THENL [ALL_TAC; CONV_TAC COMPLEX_FIELD] THEN
386 ASM_REWRITE_TAC[CPOW_EQ_0; CX_INJ; REAL_OF_NUM_EQ] THEN ASM_ARITH_TAC;
388 X_GEN_TAC `s:complex` THEN REWRITE_TAC[IN_ELIM_THM; real_gt] THEN
389 DISCH_TAC THEN EXISTS_TAC `min (Re s / &2) (&1)` THEN
390 ASM_REWRITE_TAC[REAL_LT_MIN; REAL_LT_01; REAL_HALF] THEN
391 EXISTS_TAC `\n. Cx(norm(s) + &2) pow 2 /
392 Cx(&n) cpow Cx((Re s / &2 + &1))` THEN
393 EXISTS_TAC `1` THEN CONJ_TAC THENL
394 [REWRITE_TAC[complex_div] THEN MATCH_MP_TAC SUMMABLE_COMPLEX_LMUL THEN
395 MP_TAC(SPECL [`n:num`; `Cx(Re s / &2 + &1)`] GENZETA_CONVERGES) THEN
396 REWRITE_TAC[RE_CX] THEN ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
397 REWRITE_TAC[complex_div; COMPLEX_MUL_LID] THEN MESON_TAC[summable];
399 CONJ_TAC THEN X_GEN_TAC `m:num` THEN REWRITE_TAC[from; IN_ELIM_THM] THENL
401 SUBGOAL_THEN `1 <= m` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
402 ASM_SIMP_TAC[CPOW_REAL_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT; LE_1;
403 GSYM CX_DIV; GSYM CX_POW] THEN
404 MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_EXP_POS_LE] THEN
405 MATCH_MP_TAC REAL_POW_LE THEN NORM_ARITH_TAC;
407 X_GEN_TAC `z:complex` THEN REWRITE_TAC[IN_BALL; dist] THEN STRIP_TAC THEN
408 W(MP_TAC o PART_MATCH (lhand o rand) NEARZETA_BOUND_LEMMA o lhand o snd) THEN
410 [CONJ_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
411 MP_TAC(SPEC `s - z:complex` COMPLEX_NORM_GE_RE_IM) THEN
412 REWRITE_TAC[RE_SUB] THEN ASM_REAL_ARITH_TAC;
414 MATCH_MP_TAC(REAL_ARITH `a <= b ==> x <= a ==> x <= b`) THEN
415 REWRITE_TAC[complex_div; COMPLEX_MUL_ASSOC] THEN
416 ONCE_REWRITE_TAC[COMPLEX_NORM_MUL] THEN
417 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THEN CONJ_TAC THENL
418 [REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_POW_2] THEN
419 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THEN
420 REWRITE_TAC[COMPLEX_NORM_CX] THEN
421 MATCH_MP_TAC(NORM_ARITH
422 `norm(w) = &1 /\ norm(z) <= x + &1
423 ==> norm z <= abs(x + &2) /\ norm(z - w) <= abs(x + &2)`) THEN
424 REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM] THEN ASM_NORM_ARITH_TAC;
426 ASM_SIMP_TAC[COMPLEX_NORM_INV; NORM_CPOW_REAL; REAL_CX; RE_CX;
427 REAL_OF_NUM_LT; LE_1] THEN
428 MATCH_MP_TAC REAL_LE_INV2 THEN REWRITE_TAC[REAL_EXP_POS_LT] THEN
429 REWRITE_TAC[REAL_EXP_MONO_LE] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
430 ASM_SIMP_TAC[LOG_POS; REAL_OF_NUM_LE; RE_ADD; RE_CX] THEN
431 MP_TAC(SPEC `s - z:complex` COMPLEX_NORM_GE_RE_IM) THEN
432 REWRITE_TAC[RE_SUB] THEN ASM_REAL_ARITH_TAC);;
434 let HOLOMORPHIC_NEARZETA_STRONG = prove
435 (`!n s. 1 <= n /\ &0 < Re s
436 ==> ((\m. (s - Cx(&1)) / Cx(&m) cpow s -
437 (Cx(&1) / Cx(&m) cpow (s - Cx(&1)) -
438 Cx(&1) / Cx(&(m + 1)) cpow (s - Cx(&1))))
439 sums (nearzeta n s)) (from n) /\
440 ((\m. (Cx(&1) - (s - Cx(&1)) * clog(Cx(&m))) /
442 (clog(Cx(&(m + 1))) /
443 Cx(&(m + 1)) cpow (s - Cx(&1)) -
445 Cx(&m) cpow (s - Cx(&1))))
446 sums (complex_derivative(nearzeta n) s)) (from n) /\
447 ((nearzeta n) has_complex_derivative
448 complex_derivative(nearzeta n) s) (at s)`,
449 REPEAT GEN_TAC THEN STRIP_TAC THEN
450 FIRST_ASSUM(MP_TAC o MATCH_MP HOLOMORPHIC_NEARZETA_LEMMA) THEN
451 REWRITE_TAC[IN_ELIM_THM; real_gt; LEFT_IMP_EXISTS_THM] THEN
452 MAP_EVERY X_GEN_TAC [`g:complex->complex`; `g':complex->complex`] THEN
453 GEN_REWRITE_TAC (LAND_CONV o TOP_DEPTH_CONV)
454 [FORALL_AND_THM; TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`] THEN
458 ==> ((\m. (s - Cx(&1)) / Cx(&m) cpow s -
459 (Cx(&1) / Cx(&m) cpow (s - Cx(&1)) -
460 Cx(&1) / Cx(&(m + 1)) cpow (s - Cx(&1))))
461 sums nearzeta n s) (from n)`
463 [REPEAT STRIP_TAC THEN REWRITE_TAC[nearzeta; SUMS_INFSUM] THEN
464 ASM_MESON_TAC[summable];
466 SUBGOAL_THEN `!z. &0 < Re z ==> nearzeta n z = g z` ASSUME_TAC THENL
467 [ASM_MESON_TAC[SERIES_UNIQUE]; ALL_TAC] THEN
470 `!z. &0 < Re z ==> ((nearzeta n) has_complex_derivative g' z) (at z)`
472 [REPEAT STRIP_TAC THEN
473 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_AT THEN
474 MAP_EVERY EXISTS_TAC [`g:complex->complex`; `Re z`] THEN
475 ASM_SIMP_TAC[dist] THEN
476 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN CONV_TAC SYM_CONV THEN
477 FIRST_X_ASSUM MATCH_MP_TAC THEN
478 MP_TAC(SPEC `w - z:complex` COMPLEX_NORM_GE_RE_IM) THEN
479 REWRITE_TAC[RE_SUB] THEN ASM_REAL_ARITH_TAC;
481 ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DERIVATIVE]);;
483 let NEARZETA_CONVERGES = prove
485 ==> ((\m. (s - Cx(&1)) / Cx(&m) cpow s -
486 (Cx(&1) / Cx(&m) cpow (s - Cx(&1)) -
487 Cx(&1) / Cx(&(m + 1)) cpow (s - Cx(&1))))
488 sums nearzeta n s) (from n)`,
489 REPEAT STRIP_TAC THEN REWRITE_TAC[nearzeta; SUMS_INFSUM] THEN
490 MATCH_MP_TAC SUMMABLE_EQ_COFINITE THEN EXISTS_TAC `from(n + 1)` THEN
492 `from(n + 1) DIFF from n UNION from n DIFF from(n + 1) = {n}`
493 (fun th -> REWRITE_TAC[th; FINITE_INSERT; FINITE_RULES])
495 [SIMP_TAC[EXTENSION; IN_DIFF; IN_UNION; IN_FROM; IN_SING] THEN ARITH_TAC;
496 MP_TAC(SPECL [`n + 1`; `s:complex`] HOLOMORPHIC_NEARZETA_STRONG) THEN
497 ASM_REWRITE_TAC[summable] THEN ANTS_TAC THENL [ARITH_TAC; MESON_TAC[]]]);;
499 let SUMS_COMPLEX_DERIVATIVE_NEARZETA = prove
500 (`!n s. 1 <= n /\ &0 < Re s
501 ==> ((\m. (Cx(&1) - (s - Cx(&1)) * clog(Cx(&m))) / Cx(&m) cpow s -
502 (clog(Cx(&(m + 1))) / Cx(&(m + 1)) cpow (s - Cx(&1)) -
503 clog(Cx(&m)) / Cx(&m) cpow (s - Cx(&1)))) sums
504 (complex_derivative (nearzeta n) s)) (from n)`,
505 SIMP_TAC[HOLOMORPHIC_NEARZETA_STRONG]);;
507 let HOLOMORPHIC_NEARZETA = prove
508 (`!n. 1 <= n ==> (nearzeta n) holomorphic_on {s | Re(s) > &0}`,
509 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_HALFSPACE_RE_GT; IN_ELIM_THM] THEN
510 REWRITE_TAC[real_gt] THEN MESON_TAC[HOLOMORPHIC_NEARZETA_STRONG]);;
512 let COMPLEX_DIFFERENTIABLE_NEARZETA = prove
513 (`!n s. 1 <= n /\ &0 < Re s ==> (nearzeta n) complex_differentiable (at s)`,
515 DISCH_THEN(MP_TAC o MATCH_MP HOLOMORPHIC_NEARZETA_STRONG) THEN
516 MESON_TAC[complex_differentiable]);;
518 let NEARZETA_1 = prove
519 (`!n. 1 <= n ==> nearzeta n (Cx(&1)) = Cx(&0)`,
520 REPEAT STRIP_TAC THEN REWRITE_TAC[nearzeta; COMPLEX_SUB_REFL] THEN
521 MATCH_MP_TAC INFSUM_UNIQUE THEN
522 MATCH_MP_TAC SUMS_EQ THEN EXISTS_TAC `\n:num. (vec 0:complex)` THEN
523 REWRITE_TAC[SERIES_0; GSYM COMPLEX_VEC_0] THEN
524 REWRITE_TAC[COMPLEX_VEC_0; IN_FROM; complex_div] THEN X_GEN_TAC `m:num` THEN
526 SUBGOAL_THEN `~(m = 0)` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
527 ASM_SIMP_TAC[CPOW_N; CX_INJ; REAL_OF_NUM_EQ; ADD_EQ_0; ARITH_EQ] THEN
528 REWRITE_TAC[complex_pow] THEN
529 CONV_TAC COMPLEX_RING);;
531 let HOLOMORPHIC_ZETA = prove
532 (`zeta holomorphic_on {s | Re(s) > &0 /\ ~(s = Cx(&1))}`,
533 GEN_REWRITE_TAC LAND_CONV [GSYM ETA_AX] THEN REWRITE_TAC[zeta; genzeta] THEN
534 MATCH_MP_TAC HOLOMORPHIC_TRANSFORM THEN
535 EXISTS_TAC `\z. (nearzeta 1 z + Cx(&1) / Cx(&1) cpow (z - Cx(&1))) /
537 SIMP_TAC[IN_ELIM_THM] THEN MATCH_MP_TAC HOLOMORPHIC_ON_DIV THEN
538 SIMP_TAC[IN_ELIM_THM; COMPLEX_SUB_0; HOLOMORPHIC_ON_SUB;
539 HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ID] THEN
540 MATCH_MP_TAC HOLOMORPHIC_ON_ADD THEN CONJ_TAC THENL
541 [MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
542 EXISTS_TAC `{s | Re s > &0}` THEN
543 SIMP_TAC[HOLOMORPHIC_NEARZETA; LE_REFL; ETA_AX] THEN
544 REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN REAL_ARITH_TAC;
545 REWRITE_TAC[holomorphic_on; GSYM complex_differentiable] THEN
546 REPEAT STRIP_TAC THEN COMPLEX_DIFFERENTIABLE_TAC THEN
547 REWRITE_TAC[CPOW_EQ_0; CX_INJ; REAL_OF_NUM_EQ; ARITH_EQ]]);;
549 let COMPLEX_DIFFERENTIABLE_AT_ZETA = prove
550 (`!s. &0 < Re s /\ ~(s = Cx(&1))
551 ==> zeta complex_differentiable at s`,
552 MP_TAC HOLOMORPHIC_ZETA THEN
553 REWRITE_TAC[SET_RULE `{s | P s /\ ~(s = a)} = {s | P s} DELETE a`] THEN
554 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_DELETE; OPEN_HALFSPACE_RE_GT] THEN
555 REWRITE_TAC[complex_differentiable; IN_ELIM_THM; IN_DELETE; real_gt]);;
557 (* ------------------------------------------------------------------------- *)
558 (* Euler product formula. Nice proof from Ahlfors' book avoiding any *)
559 (* messing round with the geometric series. *)
560 (* ------------------------------------------------------------------------- *)
562 let SERIES_DIVISORS_LEMMA = prove
564 ((\n. x(p * n)) sums l) k
566 (!n. (p * n) IN k <=> n IN k)
567 ==> (x sums l) {n | n IN k /\ p divides n}`,
569 DISCH_THEN(fun th -> REPEAT STRIP_TAC THEN MP_TAC th) THEN
570 REWRITE_TAC[sums; LIM_SEQUENTIALLY] THEN
571 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `e:real` THEN
572 ASM_CASES_TAC `&0 < e` THEN ASM_REWRITE_TAC[] THEN
573 DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN EXISTS_TAC `p * N:num` THEN
574 X_GEN_TAC `n:num` THEN DISCH_TAC THEN
575 FIRST_X_ASSUM(MP_TAC o SPEC `n DIV p`) THEN
576 ASM_SIMP_TAC[LE_RDIV_EQ] THEN MATCH_MP_TAC EQ_IMP THEN
577 AP_THM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
578 AP_THM_TAC THEN AP_TERM_TAC THEN
579 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [GSYM o_DEF] THEN
580 W(fun (asl,w) -> MP_TAC(PART_MATCH (rand o rand) VSUM_IMAGE (lhand w))) THEN
581 ASM_SIMP_TAC[FINITE_INTER_NUMSEG; EQ_MULT_LCANCEL] THEN
582 DISCH_THEN(SUBST1_TAC o SYM) THEN AP_THM_TAC THEN AP_TERM_TAC THEN
583 REWRITE_TAC[EXTENSION; IN_IMAGE; IN_ELIM_THM; IN_INTER; IN_NUMSEG] THEN
584 ASM_SIMP_TAC[LE_RDIV_EQ; divides; LE_0] THEN ASM_MESON_TAC[]);;
586 let EULER_PRODUCT_LEMMA = prove
587 (`!s ps. &1 < Re s /\ FINITE ps /\ (!p. p IN ps ==> prime p)
588 ==> ((\n. Cx(&1) / Cx(&n) cpow s) sums
589 (cproduct ps (\p. Cx(&1) - inv(Cx(&p) cpow s)) * zeta s))
590 {n | 1 <= n /\ !p. prime p /\ p divides n ==> ~(p IN ps)}`,
592 (`(x sums (k + l)) (s UNION t) /\ s INTER t = {}
593 ==> (x sums k) s ==> (x sums l) t`,
594 REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
595 REWRITE_TAC[IMP_IMP] THEN REWRITE_TAC[sums] THEN
596 DISCH_THEN(MP_TAC o MATCH_MP LIM_SUB) THEN REWRITE_TAC[VECTOR_ADD_SUB] THEN
597 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
598 ABS_TAC THEN ASM_SIMP_TAC[SET_RULE
600 ==> t INTER u = (((s UNION t) INTER u) DIFF (s INTER u))`] THEN
601 CONV_TAC SYM_CONV THEN MATCH_MP_TAC VSUM_DIFF THEN
602 REWRITE_TAC[FINITE_INTER_NUMSEG] THEN SET_TAC[]) in
603 REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN
604 GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
605 SIMP_TAC[CPRODUCT_CLAUSES] THEN
606 ASM_SIMP_TAC[ZETA_CONVERGES; COMPLEX_MUL_LID; NOT_IN_EMPTY; GSYM from] THEN
607 MAP_EVERY X_GEN_TAC [`p:num`; `ps:num->bool`] THEN
608 REWRITE_TAC[IN_INSERT; TAUT `a \/ b ==> c <=> (a ==> c) /\ (b ==> c)`] THEN
609 SIMP_TAC[FORALL_AND_THM; LEFT_FORALL_IMP_THM; EXISTS_REFL] THEN
610 DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN
611 ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
612 FIRST_ASSUM(MP_TAC o SPEC `inv(Cx(&p) cpow s)` o MATCH_MP
613 SERIES_COMPLEX_LMUL) THEN
614 REWRITE_TAC[complex_div] THEN
615 ONCE_REWRITE_TAC[COMPLEX_RING `x * Cx(&1) * y = Cx(&1) * x * y`] THEN
616 REWRITE_TAC[GSYM COMPLEX_INV_MUL] THEN REWRITE_TAC[GSYM complex_div] THEN
617 ASM_SIMP_TAC[GSYM CPOW_MUL_REAL; REAL_CX; RE_CX; REAL_POS] THEN
618 REWRITE_TAC[GSYM CX_MUL; REAL_OF_NUM_MUL] THEN
619 DISCH_THEN(MP_TAC o MATCH_MP (REWRITE_RULE[]
620 (ISPEC `\n. Cx(&1) / Cx(&n) cpow s` SERIES_DIVISORS_LEMMA))) THEN
622 [SUBGOAL_THEN `~(p = 0)` ASSUME_TAC THENL
623 [ASM_MESON_TAC[PRIME_0]; ALL_TAC] THEN
624 ASM_REWRITE_TAC[IN_ELIM_THM] THEN
625 ASM_SIMP_TAC[PRIME_DIVPROD_EQ] THEN
626 ASM_REWRITE_TAC[MULT_EQ_0; ARITH_RULE `1 <= n <=> ~(n = 0)`] THEN
627 X_GEN_TAC `m:num` THEN ASM_CASES_TAC `m = 0` THEN ASM_REWRITE_TAC[] THEN
628 ASM_MESON_TAC[PRIME_PRIME_FACTOR; PRIME_1];
630 MATCH_MP_TAC lemma THEN REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC] THEN
631 REWRITE_TAC[COMPLEX_RING `a * x + (Cx(&1) - a) * x = x`] THEN
632 CONJ_TAC THENL [ALL_TAC; ASM SET_TAC[]] THEN FIRST_X_ASSUM(fun th ->
633 MP_TAC th THEN MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC) THEN
636 let SUMMABLE_SUBZETA = prove
637 (`!s t. &1 < Re s /\ ~(0 IN t)
638 ==> summable t (\n. Cx (&1) / Cx (&n) cpow s)`,
639 REPEAT STRIP_TAC THEN MATCH_MP_TAC SUMMABLE_SUBSET THEN
640 EXISTS_TAC `from 1` THEN CONJ_TAC THENL
641 [REWRITE_TAC[SUBSET; IN_FROM] THEN ASM_MESON_TAC[LE_1]; ALL_TAC] THEN
642 MATCH_MP_TAC SERIES_COMPARISON_COMPLEX THEN
643 EXISTS_TAC `\n. Cx(&1) / Cx(&n) cpow (Cx(Re s))` THEN REPEAT CONJ_TAC THENL
644 [REWRITE_TAC[summable] THEN EXISTS_TAC `zeta (Cx(Re s))` THEN
645 MATCH_MP_TAC ZETA_CONVERGES THEN ASM_REWRITE_TAC[RE_CX];
646 SIMP_TAC[IN_FROM; LE_1; CPOW_REAL_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT;
647 GSYM CX_DIV; REAL_LE_DIV; REAL_POS; REAL_EXP_POS_LE];
648 EXISTS_TAC `0` THEN REWRITE_TAC[GE; LE_0; IN_FROM] THEN
649 REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
650 ASM_REWRITE_TAC[NORM_0; NORM_POS_LE] THEN
651 ASM_SIMP_TAC[COMPLEX_NORM_DIV; NORM_CPOW_REAL; REAL_CX; RE_CX;
652 REAL_LE_REFL; REAL_OF_NUM_LT; LE_1]]);;
654 let EULER_PRODUCT_MULTIPLY = prove
656 ==> ((\n. cproduct {p | prime p /\ p <= n}
657 (\p. Cx(&1) - inv(Cx(&p) cpow s)) * zeta s)
658 --> Cx(&1)) sequentially`,
659 REPEAT STRIP_TAC THEN MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
661 `\n. infsum {m | 1 <= m /\ !p. prime p /\ p divides m
662 ==> ~(p IN {p | prime p /\ p <= n})}
663 (\n. Cx (&1) / Cx (&n) cpow s)` THEN
665 [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `n:num` THEN
666 REWRITE_TAC[] THEN MATCH_MP_TAC INFSUM_UNIQUE THEN
667 MATCH_MP_TAC EULER_PRODUCT_LEMMA THEN
668 ASM_SIMP_TAC[IN_ELIM_THM] THEN MATCH_MP_TAC FINITE_SUBSET THEN
669 EXISTS_TAC `0..n` THEN REWRITE_TAC[FINITE_NUMSEG] THEN
670 SIMP_TAC[SUBSET; IN_ELIM_THM; LE_0; IN_NUMSEG];
672 REWRITE_TAC[LIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN STRIP_TAC THEN
673 SUBGOAL_THEN `?l. ((\n. Cx (&1) / Cx (&n) cpow Cx(Re s)) sums l) (from 1)`
675 [MP_TAC(SPEC `Cx(Re s)` ZETA_CONVERGES) THEN
676 ASM_SIMP_TAC[RE_CX] THEN MESON_TAC[];
678 REWRITE_TAC[SERIES_CAUCHY] THEN
679 DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF; GE] THEN
680 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
681 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `n:num` THEN
682 DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
684 MP_TAC(ISPECL [`s:complex`;
685 `{m | 1 <= m /\ (!p. prime p /\ p divides m ==> n < p)}`]
686 SUMMABLE_SUBZETA) THEN
687 ASM_REWRITE_TAC[IN_ELIM_THM; ARITH] THEN
688 REWRITE_TAC[GSYM SUMS_INFSUM] THEN REWRITE_TAC[sums; LIM_SEQUENTIALLY] THEN
689 DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
690 DISCH_THEN(X_CHOOSE_THEN `N2:num` (MP_TAC o SPEC `N1 + N2 + 1`)) THEN
691 ANTS_TAC THENL [ARITH_TAC; ALL_TAC] THEN SIMP_TAC[NOT_LE] THEN
692 MATCH_MP_TAC(REAL_ARITH
693 `dist(x,z) < e / &2 /\ dist(y,z) <= dist(x,y) + dist(x,z)
694 ==> dist(x,y) < e / &2 ==> dist(y,z) < e`) THEN
695 CONJ_TAC THENL [ALL_TAC; ASM_MESON_TAC[DIST_TRIANGLE; DIST_SYM]] THEN
696 FIRST_X_ASSUM(MP_TAC o SPEC `N1 + N2 + 1`) THEN
697 MATCH_MP_TAC(REAL_ARITH `x <= y ==> y < e ==> x < e`) THEN
698 REWRITE_TAC[dist] THEN SUBGOAL_THEN
700 ({m | 1 <= m /\ (!p. prime p /\ p divides m ==> n < p)} INTER
702 (\n. Cx (&1) / Cx (&n) cpow s) - Cx(&1) =
704 (({m | 1 <= m /\ (!p. prime p /\ p divides m ==> n < p)} INTER
705 (0..N1 + N2 + 1)) DELETE 1)
706 (\n. Cx (&1) / Cx (&n) cpow s)`
708 [SIMP_TAC[VSUM_DELETE_CASES; FINITE_INTER_NUMSEG] THEN
709 REWRITE_TAC[IN_ELIM_THM; DIVIDES_ONE; IN_INTER] THEN
710 REWRITE_TAC[CPOW_1; COMPLEX_DIV_1] THEN
711 REWRITE_TAC[MESON[] `(!x. P x /\ x = 1 ==> Q x) <=> P 1 ==> Q 1`] THEN
712 REWRITE_TAC[PRIME_1; IN_NUMSEG; ARITH; ARITH_RULE `1 <= a + b + 1`];
714 MATCH_MP_TAC COMPLEX_NORM_VSUM_BOUND_SUBSET THEN
715 REWRITE_TAC[FINITE_INTER_NUMSEG] THEN CONJ_TAC THENL
716 [SIMP_TAC[SUBSET; IN_DELETE; IN_INTER; IN_ELIM_THM; IN_NUMSEG; IN_FROM] THEN
717 ASM_MESON_TAC[PRIME_FACTOR; DIVIDES_LE; NUM_REDUCE_CONV `1 <= 0`;
718 LT_IMP_LE; LE_TRANS];
720 X_GEN_TAC `m:num` THEN REWRITE_TAC[IN_INTER; IN_FROM] THEN STRIP_TAC THEN
721 REWRITE_TAC[complex_div; COMPLEX_MUL_LID; COMPLEX_NORM_INV] THEN
722 ASM_SIMP_TAC[CPOW_REAL_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT; LE_1;
724 SIMP_TAC[REAL_INV; REAL_CX; GSYM CX_INV; RE_CX; REAL_LE_REFL]);;
726 let ZETA_NONZERO_LEMMA = prove
727 (`!s. &1 < Re s ==> ~(zeta s = Cx(&0))`,
728 REPEAT STRIP_TAC THEN
729 FIRST_ASSUM(MP_TAC o MATCH_MP EULER_PRODUCT_MULTIPLY) THEN
730 REWRITE_TAC[LIM_SEQUENTIALLY] THEN DISCH_THEN(MP_TAC o SPEC `&1 / &2`) THEN
731 CONV_TAC REAL_RAT_REDUCE_CONV THEN
732 DISCH_THEN(X_CHOOSE_THEN `n:num` (MP_TAC o SPEC `n:num`)) THEN
733 ASM_REWRITE_TAC[COMPLEX_MUL_RZERO; LE_REFL] THEN
734 REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG; COMPLEX_NORM_CX] THEN
735 CONV_TAC REAL_RAT_REDUCE_CONV);;
737 let EULER_PRODUCT = prove
739 ==> ((\n. cproduct {p | prime p /\ p <= n}
740 (\p. inv(Cx(&1) - inv(Cx(&p) cpow s))))
741 --> zeta(s)) sequentially`,
742 REPEAT STRIP_TAC THEN
743 GEN_REWRITE_TAC (PAT_CONV `\x. ((\n. x) --> x) sq`)
744 [GSYM COMPLEX_INV_INV] THEN
745 MATCH_MP_TAC LIM_COMPLEX_INV THEN
746 ASM_SIMP_TAC[COMPLEX_INV_EQ_0; ZETA_NONZERO_LEMMA] THEN
747 FIRST_ASSUM(MP_TAC o MATCH_MP EULER_PRODUCT_MULTIPLY) THEN
748 DISCH_THEN(MP_TAC o SPEC `inv(zeta(s))` o MATCH_MP LIM_COMPLEX_RMUL) THEN
749 REWRITE_TAC[COMPLEX_MUL_LID; GSYM COMPLEX_MUL_ASSOC] THEN
750 ASM_SIMP_TAC[ZETA_NONZERO_LEMMA; COMPLEX_MUL_RINV; COMPLEX_MUL_RID] THEN
751 ASM_SIMP_TAC[GSYM CPRODUCT_INV; FINITE_ATMOST; COMPLEX_INV_INV]);;
753 (* ------------------------------------------------------------------------- *)
754 (* Show that s = 1 is not a zero, just for tidiness. *)
755 (* ------------------------------------------------------------------------- *)
757 let SUMS_GAMMA = prove
758 (`((\n. Cx(sum(1..n) (\i. &1 / &i - (log(&(i + 1)) - log(&i))))) -->
759 complex_derivative (nearzeta 1) (Cx(&1))) sequentially`,
760 MP_TAC(SPECL [`1`; `Cx(&1)`] SUMS_COMPLEX_DERIVATIVE_NEARZETA) THEN
761 SIMP_TAC[GSYM VSUM_CX; FINITE_NUMSEG; RE_CX; REAL_LT_01; LE_REFL] THEN
762 REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_MUL_LZERO; CPOW_N; sums] THEN
763 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] LIM_TRANSFORM_EVENTUALLY) THEN
764 MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `n:num` THEN
765 REWRITE_TAC[FROM_INTER_NUMSEG] THEN MATCH_MP_TAC VSUM_EQ THEN
766 SIMP_TAC[IN_NUMSEG; CX_INJ; REAL_OF_NUM_EQ; ADD_EQ_0; ARITH; REAL_OF_NUM_LT;
767 ARITH_RULE `1 <= i ==> 0 < i /\ ~(i = 0)`; GSYM CX_LOG;
768 ARITH_RULE `0 < i + 1`] THEN
769 REWRITE_TAC[complex_pow; COMPLEX_POW_1; COMPLEX_SUB_RZERO] THEN
770 REWRITE_TAC[GSYM CX_DIV; GSYM CX_SUB; REAL_DIV_1]);;
772 let ZETA_1_NZ = prove
773 (`~(zeta(Cx(&1)) = Cx(&0))`,
774 REWRITE_TAC[zeta; genzeta] THEN DISCH_TAC THEN
775 SUBGOAL_THEN `&1 - log(&2) <= Re(complex_derivative (nearzeta 1) (Cx(&1)))`
777 [REWRITE_TAC[RE_DEF] THEN
778 MATCH_MP_TAC(ISPEC `sequentially` LIM_COMPONENT_LBOUND) THEN
779 EXISTS_TAC `\n. Cx(sum(1..n) (\i. &1 / &i - (log(&(i + 1)) - log(&i))))` THEN
780 REWRITE_TAC[SUMS_GAMMA; TRIVIAL_LIMIT_SEQUENTIALLY; DIMINDEX_2; ARITH] THEN
781 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
782 EXISTS_TAC `1` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
783 REWRITE_TAC[GSYM RE_DEF; RE_CX] THEN
784 ASM_SIMP_TAC[SUM_CLAUSES_LEFT; ARITH; REAL_DIV_1; LOG_1] THEN
785 REWRITE_TAC[REAL_ARITH `a - b <= a - (b - &0) + c <=> &0 <= c`] THEN
786 MATCH_MP_TAC SUM_POS_LE THEN REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN
787 SIMP_TAC[REAL_SUB_LE; GSYM LOG_DIV; REAL_OF_NUM_LT;
788 ARITH_RULE `2 <= x ==> 0 < x /\ 0 < x + 1`] THEN
789 REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN
790 SIMP_TAC[REAL_FIELD `&0 < x ==> (x + &1) / x = &1 + &1 / x`;
791 REAL_OF_NUM_LT; ARITH_RULE `2 <= x ==> 0 < x`] THEN
792 SIMP_TAC[LOG_LE; REAL_LE_DIV; REAL_POS];
793 ASM_REWRITE_TAC[RE_CX; REAL_NOT_LE; REAL_SUB_LT] THEN
794 GEN_REWRITE_TAC I [GSYM REAL_EXP_MONO_LT] THEN
795 SIMP_TAC[EXP_LOG; REAL_OF_NUM_LT; ARITH] THEN
796 SUBGOAL_THEN `(&1 + &1 / &2) pow 2 <= exp(&1 / &2) pow 2` MP_TAC THENL
797 [MATCH_MP_TAC REAL_POW_LE2 THEN
798 CONJ_TAC THENL [CONV_TAC REAL_RAT_REDUCE_CONV; ALL_TAC] THEN
799 REWRITE_TAC[REAL_EXP_LE_X];
801 SIMP_TAC[GSYM REAL_EXP_N; REAL_DIV_LMUL; REAL_OF_NUM_EQ; ARITH] THEN
804 (* ------------------------------------------------------------------------- *)
805 (* Lack of zeros on Re(s) >= 1. Nice proof from Bak & Newman. *)
806 (* ------------------------------------------------------------------------- *)
808 let ZETA_MULTIPLE_BOUND = prove
809 (`!x y. real x /\ real y /\ &1 < Re x
810 ==> &1 <= norm(zeta(x) pow 3 *
811 zeta(x + ii * y) pow 4 *
812 zeta(x + Cx(&2) * ii * y) pow 2)`,
814 (`&0 <= a /\ &0 <= b /\ &0 <= c /\
815 c * (&2 * a + b) pow 3 / &27 <= x
816 ==> c * a pow 2 * b <= x`,
817 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
818 MATCH_MP_TAC(REAL_ARITH `a <= b ==> b <= x ==> a <= x`) THEN
819 MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN
820 REWRITE_TAC[REAL_ARITH
821 `a pow 2 * b <= (&2 * a + b) pow 3 / &27 <=>
822 &0 <= (&8 / &27 * a + &1 / &27 * b) * (a - b) pow 2`] THEN
823 MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_POW_2; REAL_LE_SQUARE] THEN
826 (`-- &1 <= t /\ t <= &1
827 ==> &0 <= &1 + r pow 2 - &2 * r * t`,
828 REPEAT STRIP_TAC THEN MATCH_MP_TAC(REAL_ARITH
829 `&0 <= (&1 - t) * (&1 + t) /\ &0 <= (r - t) pow 2
830 ==> &0 <= &1 + r pow 2 - &2 * r * t`) THEN
831 REWRITE_TAC[REAL_POW_2; REAL_LE_SQUARE] THEN
832 MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC) in
833 REPEAT STRIP_TAC THEN MATCH_MP_TAC(ISPEC `sequentially` LIM_NORM_LBOUND) THEN
835 `\n. cproduct {p | prime p /\ p <= n}
836 (\p. inv(Cx(&1) - inv(Cx(&p) cpow x))) pow 3 *
837 cproduct {p | prime p /\ p <= n}
838 (\p. inv(Cx(&1) - inv(Cx(&p) cpow (x + ii * y)))) pow 4 *
839 cproduct {p | prime p /\ p <= n}
841 inv(Cx(&p) cpow (x + Cx(&2) * ii * y)))) pow 2` THEN
842 REWRITE_TAC[eventually; TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL
843 [REPEAT(MATCH_MP_TAC LIM_COMPLEX_MUL THEN CONJ_TAC) THEN
844 MATCH_MP_TAC LIM_COMPLEX_POW THEN
845 MATCH_MP_TAC EULER_PRODUCT THEN
846 RULE_ASSUM_TAC(REWRITE_RULE[real]) THEN
847 ASM_REWRITE_TAC[RE_ADD; RE_MUL_CX; RE_MUL_II;
848 REAL_NEG_0; REAL_ADD_RID; REAL_MUL_RZERO];
850 EXISTS_TAC `0` THEN REWRITE_TAC[SEQUENTIALLY; GE; LE_0] THEN
851 X_GEN_TAC `n:num` THEN
852 GEN_REWRITE_TAC BINOP_CONV [GSYM REAL_INV_INV] THEN
853 MATCH_MP_TAC REAL_LE_INV2 THEN
854 REWRITE_TAC[GSYM COMPLEX_NORM_INV; COMPLEX_NORM_NZ; COMPLEX_INV_EQ_0] THEN
855 ASM_SIMP_TAC[COMPLEX_ENTIRE; COMPLEX_POW_EQ_0; ARITH; COMPLEX_INV_EQ_0;
856 CPRODUCT_EQ_0; IN_ELIM_THM; FINITE_ATMOST] THEN
857 REWRITE_TAC[COMPLEX_RING `Cx(&1) - x = Cx(&0) <=> x = Cx(&1)`] THEN
858 REWRITE_TAC[DE_MORGAN_THM; NOT_EXISTS_THM] THEN CONJ_TAC THENL
859 [REWRITE_TAC[TAUT `(~p \/ ~q) \/ ~r <=> p /\ q ==> ~r`] THEN
860 REPEAT CONJ_TAC THEN X_GEN_TAC `p:num` THEN STRIP_TAC THEN
861 DISCH_THEN(MP_TAC o AP_TERM `(norm:complex->real) o inv`) THEN
862 REWRITE_TAC[COMPLEX_NORM_INV; o_THM; COMPLEX_NORM_CX; REAL_ABS_NUM;
863 REAL_INV_INV; REAL_INV_1] THEN
864 ASM_SIMP_TAC[NORM_CPOW_REAL; REAL_OF_NUM_LT; PRIME_IMP_NZ; LT_NZ;
865 REAL_EXP_EQ_1; REAL_CX; RE_CX] THEN
866 RULE_ASSUM_TAC(REWRITE_RULE[real]) THEN
867 ASM_REWRITE_TAC[REAL_ENTIRE; RE_ADD; RE_MUL_CX; RE_MUL_II;
868 REAL_NEG_0; REAL_ADD_RID; REAL_MUL_RZERO] THEN
869 MATCH_MP_TAC(REAL_ARITH `&1 < x /\ &0 < y ==> ~(x = &0 \/ y = &0)`) THEN
870 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC LOG_POS_LT THEN
871 FIRST_ASSUM(MP_TAC o MATCH_MP PRIME_GE_2) THEN
872 REWRITE_TAC[REAL_OF_NUM_LT] THEN ARITH_TAC;
874 ASM_SIMP_TAC[GSYM CPRODUCT_POW; FINITE_ATMOST; GSYM CPRODUCT_MUL] THEN
875 SIMP_TAC[GSYM CPRODUCT_INV; COMPLEX_INV_INV; FINITE_ATMOST] THEN
876 REWRITE_TAC[COMPLEX_INV_MUL; GSYM COMPLEX_POW_INV; COMPLEX_INV_INV] THEN
877 SIMP_TAC[NORM_CPRODUCT; FINITE_ATMOST; REAL_INV_1] THEN
878 MATCH_MP_TAC PRODUCT_LE_1 THEN SIMP_TAC[NORM_POS_LE; FINITE_ATMOST] THEN
879 X_GEN_TAC `p:num` THEN REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN
880 REWRITE_TAC[CPOW_ADD; COMPLEX_MUL_2; GSYM COMPLEX_POW_2] THEN
881 REWRITE_TAC[COMPLEX_INV_MUL] THEN
882 FIRST_ASSUM(ASSUME_TAC o MATCH_MP PRIME_IMP_NZ) THEN
883 ASM_REWRITE_TAC[cpow; CX_INJ; REAL_OF_NUM_EQ] THEN
884 ASM_SIMP_TAC[GSYM CX_LOG; REAL_OF_NUM_LT; LT_NZ] THEN
885 REWRITE_TAC[GSYM CEXP_NEG; GSYM CEXP_N] THEN
886 REPEAT(FIRST_X_ASSUM(SUBST1_TAC o SYM o CONV_RULE(REWR_CONV REAL))) THEN
887 SIMP_TAC[GSYM CX_MUL; GSYM CX_NEG; GSYM CX_EXP; GSYM COMPLEX_MUL_ASSOC] THEN
888 REWRITE_TAC[COMPLEX_RING `--(ii * x) = ii * --x`] THEN
889 REWRITE_TAC[COMPLEX_RING `--(Cx(&2) * ii * x) = ii * Cx(&2) * --x`] THEN
890 REWRITE_TAC[CEXP_EULER] THEN
891 REWRITE_TAC[CCOS_NEG; CSIN_NEG; GSYM CX_SIN; GSYM CX_COS; GSYM CX_NEG;
893 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_POW] THEN
894 SIMP_TAC[REAL_RING `(z:real) pow 4 = (z pow 2) pow 2`; COMPLEX_SQNORM] THEN
895 REWRITE_TAC[COMPLEX_SQNORM] THEN
896 REWRITE_TAC[RE_SUB; RE_CX; RE_MUL_CX; RE_ADD; RE_MUL_II;
897 IM_SUB; IM_CX; IM_MUL_CX; IM_ADD; IM_MUL_II] THEN
898 REWRITE_TAC[REAL_NEG_0; REAL_ADD_RID; REAL_SUB_LZERO; REAL_ADD_LID] THEN
899 REWRITE_TAC[REAL_RING
900 `(&1 - r * c) pow 2 + --(r * s) pow 2 =
901 &1 + r pow 2 * (s pow 2 + c pow 2) - &2 * r * c`] THEN
902 REWRITE_TAC[SIN_CIRCLE; REAL_POW_NEG; ARITH] THEN
903 ABBREV_TAC `r = exp(--(Re x * log(&p)))` THEN
904 REWRITE_TAC[COS_DOUBLE_COS; COS_NEG; GSYM CX_SUB; COMPLEX_NORM_CX] THEN
905 ABBREV_TAC `t = cos(Re y * log(&p))` THEN
906 REWRITE_TAC[REAL_MUL_RID; REAL_ARITH
907 `x - &2 * r * (&2 * y - &1) = x + &2 * r - &4 * r * y`] THEN
908 MP_TAC(SPEC `Re y * log(&p)` COS_BOUNDS) THEN ASM_REWRITE_TAC[] THEN
909 SUBGOAL_THEN `&0 < r /\ r < &1` MP_TAC THENL
910 [EXPAND_TAC "r" THEN REWRITE_TAC[REAL_EXP_POS_LT] THEN
911 SUBST1_TAC(GSYM REAL_EXP_0) THEN REWRITE_TAC[REAL_EXP_MONO_LT] THEN
912 REWRITE_TAC[REAL_LT_LNEG; REAL_ADD_RID] THEN
913 MATCH_MP_TAC REAL_LT_MUL THEN
914 ASM_SIMP_TAC[LOG_POS_LT; REAL_OF_NUM_LT; ARITH_RULE `1 < t <=> 2 <= t`;
918 SIMP_TAC[REAL_ARITH `r < &1 ==> abs(&1 - r) = (&1 - r)`] THEN
919 POP_ASSUM_LIST(K ALL_TAC) THEN REPEAT STRIP_TAC THEN
920 REPEAT(FIRST_X_ASSUM(ASSUME_TAC o MATCH_MP REAL_LT_IMP_LE)) THEN
921 MATCH_MP_TAC lemma1 THEN
922 ASM_SIMP_TAC[REAL_POW_LE; REAL_SUB_LE; lemma2] THEN CONJ_TAC THENL
923 [REWRITE_TAC[REAL_ARITH
924 `&1 + s + &2 * r - &4 * r * t = &1 + s - &2 * r * (&2 * t - &1)`] THEN
925 MATCH_MP_TAC lemma2 THEN ASM_REWRITE_TAC[] THEN
926 REWRITE_TAC[REAL_ARITH `-- &1 <= &2 * x pow 2 - &1 <=> &0 <= x * x`;
927 REAL_ARITH `&2 * t pow 2 - &1 <= &1 <=> t pow 2 <= &1 pow 2`;
929 GEN_REWRITE_TAC LAND_CONV [GSYM REAL_POW2_ABS] THEN
930 MATCH_MP_TAC REAL_POW_LE2 THEN ASM_REAL_ARITH_TAC;
932 REWRITE_TAC[REAL_ARITH
933 `x pow 3 * y pow 3 / &27 <= &1 <=> (x * y) pow 3 <= &3 pow 3`] THEN
934 MATCH_MP_TAC REAL_POW_LE2_ODD THEN REWRITE_TAC[ARITH] THEN
935 REWRITE_TAC[REAL_ARITH
936 `&2 * (&1 + r pow 2 - &2 * r * t) + &1 + r pow 2 +
937 &2 * r - &4 * r * t pow 2 =
938 (&3 + &3 * r pow 2) - &2 * r * (&2 * t pow 2 + &2 * t - &1)`] THEN
939 MATCH_MP_TAC REAL_LE_TRANS THEN
940 EXISTS_TAC `(&1 - r) * ((&3 + &3 * r pow 2) + &3 * r)` THEN CONJ_TAC THENL
941 [MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[REAL_SUB_LE] THEN
942 REWRITE_TAC[REAL_ARITH
943 `c - &2 * r * y <= c + &3 * r <=> &0 <= r * (&2 * y + &3)`] THEN
944 MATCH_MP_TAC REAL_LE_MUL THEN ASM_REWRITE_TAC[] THEN
945 REWRITE_TAC[REAL_ARITH `&0 <= &2 * (&2 * t pow 2 + &2 * t - &1) + &3 <=>
946 &0 <= (t + &1 / &2) pow 2`] THEN
947 REWRITE_TAC[REAL_POW_2; REAL_LE_SQUARE];
949 SUBGOAL_THEN `&0 <= r pow 3` MP_TAC THENL
950 [ASM_SIMP_TAC[REAL_POW_LE]; REAL_ARITH_TAC]);;
952 let ZETA_NONZERO = prove
953 (`!s. &1 <= Re s ==> ~(zeta s = Cx(&0))`,
954 REWRITE_TAC[REAL_ARITH `&1 <= x <=> &1 < x \/ x = &1`] THEN
955 REPEAT GEN_TAC THEN STRIP_TAC THEN ASM_SIMP_TAC[ZETA_NONZERO_LEMMA] THEN
956 SUBST1_TAC(SPEC `s:complex` COMPLEX_EXPAND) THEN
957 ASM_REWRITE_TAC[] THEN ABBREV_TAC `y = Im s` THEN ASM_CASES_TAC `y = &0` THEN
958 ASM_REWRITE_TAC[COMPLEX_MUL_RZERO; COMPLEX_ADD_RID; ZETA_1_NZ] THEN
959 DISCH_TAC THEN SUBGOAL_THEN
960 `~(&1 <= norm((Cx(&0) *
961 complex_derivative (\x. zeta(x + ii * Cx y)) (Cx(&1)) pow 4) *
962 zeta (Cx(&1) + Cx (&2) * ii * Cx(y)) pow 2))`
964 [REWRITE_TAC[COMPLEX_NORM_CX; COMPLEX_MUL_LZERO] THEN REAL_ARITH_TAC;
966 MATCH_MP_TAC(ISPEC `at (Cx(&1)) within {s | real s /\ &1 < Re s}`
967 LIM_NORM_LBOUND) THEN
969 `\x. zeta (x) pow 3 * zeta (x + ii * Cx(y)) pow 4 *
970 zeta (x + Cx (&2) * ii * Cx(y)) pow 2` THEN
971 REWRITE_TAC[eventually; TRIVIAL_LIMIT_WITHIN; WITHIN; AT] THEN
972 SUBGOAL_THEN `Cx(&1) limit_point_of {s | real s /\ &1 < Re s}`
974 [REWRITE_TAC[LIMPT_APPROACHABLE_LE] THEN X_GEN_TAC `e:real` THEN
975 DISCH_TAC THEN EXISTS_TAC `Cx(&1 + e)` THEN
976 REWRITE_TAC[dist; CX_INJ; IN_ELIM_THM; REAL_CX; RE_CX] THEN
977 REWRITE_TAC[GSYM CX_SUB; REAL_ADD_SUB; COMPLEX_NORM_CX] THEN
978 UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC;
980 ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
982 SIMP_TAC[IN_ELIM_THM; REAL_CX; ZETA_MULTIPLE_BOUND] THEN
983 MAP_EVERY EXISTS_TAC [`Cx(&3)`; `Cx(&2)`] THEN
984 REWRITE_TAC[dist; GSYM CX_SUB; COMPLEX_NORM_CX; REAL_CX; RE_CX] THEN
985 CONV_TAC REAL_RAT_REDUCE_CONV] THEN
986 REWRITE_TAC[COMPLEX_MUL_ASSOC] THEN MATCH_MP_TAC LIM_COMPLEX_MUL THEN
989 REWRITE_TAC[GSYM CONTINUOUS_WITHIN] THEN
990 MATCH_MP_TAC CONTINUOUS_AT_WITHIN THEN
991 MATCH_MP_TAC CONTINUOUS_COMPLEX_POW THEN
992 GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
993 MATCH_MP_TAC CONTINUOUS_AT_COMPOSE THEN
994 SIMP_TAC[CONTINUOUS_ADD; CONTINUOUS_CONST; CONTINUOUS_AT_ID] THEN
995 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_IMP_CONTINUOUS_AT THEN
996 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_AT_ZETA THEN
997 REWRITE_TAC[RE_ADD; RE_MUL_CX; RE_MUL_II; RE_II; RE_CX] THEN
998 REWRITE_TAC[COMPLEX_RING `x + y = x <=> y = Cx(&0)`] THEN
999 ASM_REWRITE_TAC[COMPLEX_ENTIRE; II_NZ; CX_INJ; REAL_OF_NUM_EQ; ARITH] THEN
1000 REAL_ARITH_TAC] THEN
1001 MATCH_MP_TAC LIM_TRANSFORM THEN
1002 EXISTS_TAC `\x. (zeta x pow 3 * (x - Cx(&1)) pow 4) *
1003 (zeta(x + ii * Cx y) / (x - Cx(&1))) pow 4` THEN
1004 REWRITE_TAC[] THEN CONJ_TAC THENL
1005 [SIMP_TAC[LIM_WITHIN; GSYM DIST_NZ; COMPLEX_SUB_0; COMPLEX_FIELD
1007 ==> (y * x pow 4) * (z / x) pow 4 - y * z pow 4 = Cx(&0)`] THEN
1008 SIMP_TAC[dist; COMPLEX_VEC_0; COMPLEX_SUB_REFL; COMPLEX_NORM_0] THEN
1009 MESON_TAC[REAL_LT_01];
1011 MATCH_MP_TAC LIM_COMPLEX_MUL THEN CONJ_TAC THENL
1013 MATCH_MP_TAC LIM_COMPLEX_POW THEN
1014 SUBGOAL_THEN `((\x. zeta (x + ii * Cx y)) has_complex_derivative
1015 complex_derivative (\x. zeta (x + ii * Cx y)) (Cx (&1)))
1016 (at (Cx (&1)) within {s | real s /\ &1 < Re s})`
1019 ASM_REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_WITHIN; COMPLEX_SUB_RZERO]] THEN
1020 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
1021 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE] THEN
1022 GEN_REWRITE_TAC LAND_CONV [GSYM o_DEF] THEN
1023 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_COMPOSE_AT THEN
1024 SIMP_TAC[COMPLEX_DIFFERENTIABLE_ADD; COMPLEX_DIFFERENTIABLE_CONST;
1025 COMPLEX_DIFFERENTIABLE_ID] THEN
1026 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_AT_ZETA THEN
1027 ASM_REWRITE_TAC[RE_ADD; RE_MUL_II; COMPLEX_RING `x + y = x <=> y = Cx(&0)`;
1028 IM_CX; COMPLEX_ENTIRE; II_NZ; RE_CX; CX_INJ] THEN
1029 REAL_ARITH_TAC] THEN
1030 MATCH_MP_TAC LIM_TRANSFORM THEN
1031 EXISTS_TAC `\x. (nearzeta 1 (x) + Cx(&1)) pow 3 * (x - Cx(&1))` THEN
1033 [SIMP_TAC[LIM_WITHIN; CPOW_1; GSYM DIST_NZ; zeta; genzeta; COMPLEX_DIV_1;
1036 ==> b * (x - a) - (c / (x - a)) pow 3 * (x - a) pow 4 =
1037 (b - c pow 3) * (x - a)`] THEN
1038 REWRITE_TAC[dist; VECTOR_SUB_RZERO; VECTOR_SUB_REFL] THEN
1039 SIMP_TAC[COMPLEX_VEC_0; COMPLEX_MUL_LZERO; COMPLEX_NORM_0] THEN
1040 MESON_TAC[REAL_LT_01];
1042 MATCH_MP_TAC LIM_AT_WITHIN THEN SUBST1_TAC(COMPLEX_RING
1043 `Cx(&0) = (nearzeta 1 (Cx(&1)) + Cx(&1)) pow 3 * (Cx(&1) - Cx(&1))`) THEN
1044 MATCH_MP_TAC LIM_COMPLEX_MUL THEN
1045 SIMP_TAC[LIM_SUB; LIM_CONST; LIM_AT_ID] THEN
1046 MATCH_MP_TAC LIM_COMPLEX_POW THEN MATCH_MP_TAC LIM_ADD THEN
1047 REWRITE_TAC[LIM_CONST] THEN REWRITE_TAC[GSYM CONTINUOUS_AT] THEN
1048 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_IMP_CONTINUOUS_AT THEN
1049 ASM_SIMP_TAC[ETA_AX; COMPLEX_DIFFERENTIABLE_NEARZETA;
1050 RE_CX; REAL_OF_NUM_LT; ARITH]);;
1052 let NEARZETA_NONZERO = prove
1053 (`!s. &1 <= Re s ==> ~(nearzeta 1 s + Cx (&1) = Cx(&0))`,
1054 REPEAT GEN_TAC THEN DISCH_TAC THEN
1055 FIRST_ASSUM(MP_TAC o MATCH_MP ZETA_NONZERO) THEN
1056 REWRITE_TAC[zeta; genzeta] THEN COND_CASES_TAC THEN
1057 ASM_SIMP_TAC[NEARZETA_1; ARITH; CPOW_1] THEN
1058 REPEAT(POP_ASSUM MP_TAC) THEN CONV_TAC COMPLEX_FIELD);;
1060 (* ------------------------------------------------------------------------- *)
1061 (* The logarithmic derivative of the zeta function. *)
1062 (* ------------------------------------------------------------------------- *)
1064 let NORM_CLOG_BOUND = prove
1065 (`norm(z) <= &1 / &2 ==> norm(clog(Cx(&1) - z)) <= &2 * norm(z)`,
1066 REPEAT STRIP_TAC THEN
1067 MP_TAC(ISPECL [`\z. clog(Cx(&1) - z)`; `\z. inv(z - Cx(&1))`;
1068 `cball(Cx(&0),&1 / &2)`; `&2`] COMPLEX_DIFFERENTIABLE_BOUND) THEN
1071 DISCH_THEN(MP_TAC o SPECL [`z:complex`; `Cx(&0)`]) THEN
1072 REWRITE_TAC[COMPLEX_SUB_RZERO; CLOG_1] THEN DISCH_THEN MATCH_MP_TAC THEN
1073 ASM_REWRITE_TAC[CENTRE_IN_CBALL] THEN REWRITE_TAC[IN_CBALL] THEN
1074 ASM_REWRITE_TAC[dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
1075 CONV_TAC REAL_RAT_REDUCE_CONV] THEN
1076 REWRITE_TAC[CONVEX_CBALL; IN_CBALL; dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
1077 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN CONJ_TAC THENL
1078 [COMPLEX_DIFF_TAC THEN
1079 REWRITE_TAC[COMPLEX_RING `(Cx(&0) - Cx(&1)) * x = --x`] THEN
1080 REWRITE_TAC[COMPLEX_NEG_INV; COMPLEX_NEG_SUB] THEN
1081 DISCH_THEN(K ALL_TAC) THEN REWRITE_TAC[RE_SUB; REAL_SUB_LT] THEN
1082 MP_TAC(SPEC `w:complex` COMPLEX_NORM_GE_RE_IM) THEN
1083 REWRITE_TAC[RE_SUB; RE_CX] THEN
1086 SUBST1_TAC(SYM(REAL_RAT_REDUCE_CONV `inv(&1 / &2)`)) THEN
1087 REWRITE_TAC[COMPLEX_NORM_INV] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
1088 MP_TAC(SPEC `1` COMPLEX_NORM_NUM) THEN ASM_NORM_ARITH_TAC);;
1090 let LOGZETA_EXISTS = prove
1091 (`?logzeta logzeta'.
1092 !s. s IN {s | Re s > &1}
1093 ==> ((\p. clog(Cx(&1) - inv(Cx(&p) cpow s)))
1096 ((\p. clog(Cx(&p)) / (Cx(&p) cpow s - Cx(&1)))
1099 (logzeta has_complex_derivative logzeta'(s)) (at s)`,
1100 MATCH_MP_TAC SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX THEN
1101 REWRITE_TAC[OPEN_HALFSPACE_RE_GT] THEN CONJ_TAC THENL
1102 [REWRITE_TAC[IN_ELIM_THM; real_gt] THEN
1103 REPEAT STRIP_TAC THEN COMPLEX_DIFF_TAC THEN
1104 ASM_SIMP_TAC[CPOW_EQ_0; CX_INJ; REAL_OF_NUM_EQ; PRIME_IMP_NZ;
1105 COMPLEX_SUB_LZERO; COMPLEX_MUL_LID; COMPLEX_FIELD
1106 `~(x = Cx(&0)) ==> --(a * x) / x pow 2 = --(a / x)`] THEN
1107 REWRITE_TAC[complex_div; COMPLEX_MUL_LNEG; COMPLEX_NEG_NEG] THEN
1108 REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; GSYM COMPLEX_INV_MUL] THEN
1109 ASM_SIMP_TAC[CPOW_EQ_0; CX_INJ; REAL_OF_NUM_EQ; PRIME_IMP_NZ; COMPLEX_FIELD
1110 `~(y = Cx(&0)) ==> y * (Cx(&1) - inv(y)) = y - Cx(&1)`] THEN
1111 DISCH_THEN(K ALL_TAC) THEN REWRITE_TAC[RE_SUB; REAL_SUB_LT] THEN
1112 MATCH_MP_TAC(REAL_ARITH `!y. abs x <= y /\ y < w ==> x < w`) THEN
1113 EXISTS_TAC `norm(inv (Cx (&p) cpow s))` THEN
1114 REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN REWRITE_TAC[RE_CX] THEN
1115 ASM_SIMP_TAC[COMPLEX_NORM_INV; NORM_CPOW_REAL; REAL_CX; RE_CX;
1116 REAL_OF_NUM_LT; LT_NZ; PRIME_IMP_NZ] THEN
1117 REWRITE_TAC[GSYM REAL_EXP_NEG; GSYM REAL_EXP_0; REAL_EXP_MONO_LT] THEN
1118 REWRITE_TAC[REAL_LT_LNEG; REAL_ADD_RID] THEN MATCH_MP_TAC REAL_LT_MUL THEN
1119 ASM_SIMP_TAC[LOG_POS_LT; REAL_OF_NUM_LT; ARITH_RULE `1 < p <=> 2 <= p`;
1123 REWRITE_TAC[IN_ELIM_THM; real_gt] THEN X_GEN_TAC `s:complex` THEN
1124 DISCH_TAC THEN EXISTS_TAC `(Re(s) - &1) / &2` THEN
1125 EXISTS_TAC `\p. Cx(&2) / Cx(&p) cpow (Cx(&1 + (Re(s) - &1) / &2))` THEN
1126 ASM_REWRITE_TAC[REAL_HALF; REAL_SUB_LT; RIGHT_EXISTS_AND_THM] THEN
1128 [REWRITE_TAC[complex_div] THEN MATCH_MP_TAC SUMMABLE_COMPLEX_LMUL THEN
1129 MATCH_MP_TAC SUMMABLE_SUBSET_COMPLEX THEN EXISTS_TAC `from 1` THEN
1130 SIMP_TAC[CPOW_REAL_REAL; IN_FROM; REAL_CX; RE_CX; REAL_OF_NUM_LT;
1131 ARITH_RULE `0 < n <=> 1 <= n`; GSYM CX_INV; REAL_LE_INV_EQ;
1132 REAL_EXP_POS_LE] THEN
1133 SIMP_TAC[SUBSET; IN_ELIM_THM; IN_FROM; PRIME_GE_2;
1134 ARITH_RULE `2 <= p ==> 1 <= p`] THEN
1135 REWRITE_TAC[summable] THEN
1136 EXISTS_TAC `zeta(Cx(&1 + (Re s - &1) / &2))` THEN
1137 ONCE_REWRITE_TAC[COMPLEX_RING `inv(x) = Cx(&1) * inv x`] THEN
1138 REWRITE_TAC[GSYM complex_div] THEN MATCH_MP_TAC ZETA_CONVERGES THEN
1139 REWRITE_TAC[RE_CX] THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
1142 [SIMP_TAC[CPOW_REAL_REAL; IN_FROM; REAL_CX; RE_CX; REAL_OF_NUM_LT; LT_NZ;
1143 PRIME_IMP_NZ; GSYM CX_DIV; REAL_CX; REAL_LE_DIV; REAL_POS;
1147 `summable (from 1) (\n. Cx (&1) / Cx (&n) cpow (Cx(&1 + (Re s - &1) / &2)))`
1149 [REWRITE_TAC[summable] THEN
1150 EXISTS_TAC `zeta(Cx(&1 + (Re s - &1) / &2))` THEN
1151 MATCH_MP_TAC ZETA_CONVERGES THEN
1152 REWRITE_TAC[RE_CX] THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
1154 DISCH_THEN(MP_TAC o SPEC `&1 / &2` o MATCH_MP SERIES_GOESTOZERO) THEN
1155 CONV_TAC REAL_RAT_REDUCE_CONV THEN REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
1156 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN
1157 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `p:num` THEN
1158 DISCH_THEN(fun th ->
1159 X_GEN_TAC `y:complex` THEN STRIP_TAC THEN MP_TAC th) THEN
1160 ASM_SIMP_TAC[IN_FROM; PRIME_IMP_NZ; ARITH_RULE `1 <= n <=> ~(n = 0)`] THEN
1161 DISCH_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
1162 EXISTS_TAC `&2 * norm(inv(Cx(&p) cpow y))` THEN CONJ_TAC THENL
1163 [MATCH_MP_TAC NORM_CLOG_BOUND THEN
1164 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
1165 `x < a ==> y <= x ==> y <= a`)) THEN
1166 REWRITE_TAC[complex_div; COMPLEX_MUL_LID];
1167 SIMP_TAC[complex_div; COMPLEX_NORM_MUL; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
1168 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_POS]] THEN
1169 REWRITE_TAC[GSYM CPOW_NEG] THEN
1170 ASM_SIMP_TAC[NORM_CPOW_REAL_MONO; REAL_CX; RE_CX; REAL_OF_NUM_LT; PRIME_GE_2;
1171 ARITH_RULE `2 <= p ==> 1 < p`] THEN
1172 FIRST_ASSUM(MP_TAC o MATCH_MP IN_BALL_RE) THEN
1173 REWRITE_TAC[RE_NEG; RE_CX] THEN REAL_ARITH_TAC);;
1175 let LOGZETA_PROPERTIES =
1176 new_specification ["logzeta"; "logzeta'"] LOGZETA_EXISTS;;
1178 let [LOGZETA_CONVERGES; LOGZETA'_CONVERGES; HAS_COMPLEX_DERIVATIVE_LOGZETA] =
1179 CONJUNCTS(REWRITE_RULE[IN_ELIM_THM; FORALL_AND_THM; real_gt; TAUT
1180 `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`]
1181 LOGZETA_PROPERTIES);;
1183 let CEXP_LOGZETA = prove
1184 (`!s. &1 < Re s ==> cexp(--(logzeta s)) = zeta s`,
1185 REPEAT STRIP_TAC THEN MATCH_MP_TAC(ISPEC `sequentially` LIM_UNIQUE) THEN
1187 `\n. cexp(vsum({p | prime p} INTER (0..n))
1188 (\p. --clog(Cx(&1) - inv(Cx(&p) cpow s))))` THEN
1189 REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL
1190 [MP_TAC(ISPECL [`cexp`; `--logzeta s`] CONTINUOUS_AT_SEQUENTIALLY) THEN
1191 REWRITE_TAC[CONTINUOUS_AT_CEXP; o_DEF] THEN
1192 DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[GSYM sums] THEN
1193 MATCH_MP_TAC SERIES_NEG THEN ASM_SIMP_TAC[LOGZETA_CONVERGES];
1194 SIMP_TAC[CEXP_VSUM; FINITE_INTER_NUMSEG] THEN
1195 MATCH_MP_TAC LIM_TRANSFORM THEN
1196 EXISTS_TAC `\n. cproduct {p | prime p /\ p <= n}
1197 (\p. inv(Cx(&1) - inv(Cx(&p) cpow s)))` THEN
1198 ASM_SIMP_TAC[EULER_PRODUCT] THEN
1199 MATCH_MP_TAC LIM_EVENTUALLY THEN MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
1200 X_GEN_TAC `n:num` THEN REWRITE_TAC[VECTOR_SUB_EQ; numseg; LE_0] THEN
1201 REWRITE_TAC[SET_RULE `{x | P x} INTER {x | Q x} = {x | P x /\ Q x}`] THEN
1202 MATCH_MP_TAC CPRODUCT_EQ THEN X_GEN_TAC `p:num` THEN
1203 REWRITE_TAC[IN_ELIM_THM; CEXP_NEG] THEN STRIP_TAC THEN
1204 AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN MATCH_MP_TAC CEXP_CLOG THEN
1205 REWRITE_TAC[COMPLEX_SUB_0] THEN
1206 DISCH_THEN(MP_TAC o AP_TERM `norm:complex->real`) THEN
1207 ASM_SIMP_TAC[NORM_CPOW_REAL; REAL_CX; REAL_OF_NUM_LT; RE_CX; REAL_ABS_NUM;
1208 COMPLEX_NORM_INV; PRIME_IMP_NZ; LT_NZ; COMPLEX_NORM_CX; REAL_EXP_EQ_1] THEN
1209 CONV_TAC(RAND_CONV SYM_CONV) THEN
1210 REWRITE_TAC[GSYM REAL_EXP_0; GSYM REAL_EXP_NEG; REAL_EXP_INJ] THEN
1211 REWRITE_TAC[REAL_NEG_EQ_0; REAL_ENTIRE] THEN
1212 ASM_SIMP_TAC[REAL_ARITH `&1 < s ==> ~(s = &0)`] THEN
1213 MATCH_MP_TAC REAL_LT_IMP_NZ THEN MATCH_MP_TAC LOG_POS_LT THEN
1214 FIRST_ASSUM(MP_TAC o MATCH_MP PRIME_GE_2) THEN
1215 REWRITE_TAC[REAL_OF_NUM_LT] THEN ARITH_TAC]);;
1217 let HAS_COMPLEX_DERIVATIVE_ZETA = prove
1218 (`!s. &1 < Re s ==> (zeta has_complex_derivative
1219 (--(logzeta'(s)) * zeta(s))) (at s)`,
1220 REPEAT STRIP_TAC THEN
1221 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_AT THEN
1222 EXISTS_TAC `\s. cexp(--(logzeta s))` THEN EXISTS_TAC `Re s - &1` THEN
1223 ASM_REWRITE_TAC[REAL_SUB_LT] THEN CONJ_TAC THENL
1224 [ONCE_REWRITE_TAC[DIST_SYM] THEN REWRITE_TAC[GSYM IN_BALL] THEN
1225 REPEAT STRIP_TAC THEN MATCH_MP_TAC CEXP_LOGZETA THEN
1226 FIRST_X_ASSUM(MP_TAC o MATCH_MP IN_BALL_RE) THEN
1227 POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
1229 GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV) [GSYM o_DEF] THEN
1230 ONCE_REWRITE_TAC[COMPLEX_MUL_SYM] THEN
1231 MATCH_MP_TAC COMPLEX_DIFF_CHAIN_AT THEN
1232 ASM_SIMP_TAC[GSYM CEXP_LOGZETA; HAS_COMPLEX_DERIVATIVE_CEXP] THEN
1233 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_NEG THEN
1234 ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_LOGZETA]);;
1236 let COMPLEX_DERIVATIVE_ZETA = prove
1238 ==> complex_derivative zeta s = --(logzeta'(s)) * zeta(s)`,
1239 REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
1240 ASM_SIMP_TAC[HAS_COMPLEX_DERIVATIVE_ZETA]);;
1242 let CONVERGES_LOGZETA'' = prove
1244 ==> ((\p. Cx(log(&p)) / (Cx(&p) cpow s - Cx(&1))) sums
1245 (--(complex_derivative zeta s / zeta s))) {p | prime p}`,
1246 REPEAT STRIP_TAC THEN
1247 SUBGOAL_THEN `--(complex_derivative zeta s / zeta s) = logzeta'(s)`
1249 [ASM_SIMP_TAC[ZETA_NONZERO_LEMMA; COMPLEX_DERIVATIVE_ZETA; COMPLEX_FIELD
1250 `~(b = Cx(&0)) ==> (--(a / b) = c <=> a = --c * b)`];
1251 MATCH_MP_TAC SUMS_EQ THEN
1252 EXISTS_TAC `\p. clog(Cx(&p)) / (Cx(&p) cpow s - Cx(&1))` THEN
1253 ASM_SIMP_TAC[LOGZETA'_CONVERGES; IN_ELIM_THM] THEN
1254 SIMP_TAC[CX_LOG; REAL_OF_NUM_LT; LT_NZ; PRIME_IMP_NZ]]);;
1256 (* ------------------------------------------------------------------------- *)
1257 (* Some lemmas about negating a path. *)
1258 (* ------------------------------------------------------------------------- *)
1260 let VALID_PATH_NEGATEPATH = prove
1261 (`!g. valid_path g ==> valid_path ((--) o g)`,
1262 REWRITE_TAC[valid_path; o_DEF] THEN
1263 ASM_SIMP_TAC[PIECEWISE_DIFFERENTIABLE_NEG]);;
1265 let PATHSTART_NEGATEPATH = prove
1266 (`!g. pathstart((--) o g) = --(pathstart g)`,
1267 REWRITE_TAC[pathstart; o_THM]);;
1269 let PATHFINISH_NEGATEPATH = prove
1270 (`!g. pathfinish((--) o g) = --(pathfinish g)`,
1271 REWRITE_TAC[pathfinish; o_THM]);;
1273 let PATH_IMAGE_NEGATEPATH = prove
1274 (`!g. path_image((--) o g) = IMAGE (--) (path_image g)`,
1275 REWRITE_TAC[path_image; IMAGE_o]);;
1277 let HAS_PATH_INTEGRAL_NEGATEPATH = prove
1278 (`!g z. valid_path g /\ ((\z. f(--z)) has_path_integral (--i)) g
1279 ==> (f has_path_integral i) ((--) o g)`,
1280 REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1281 REWRITE_TAC[has_path_integral] THEN
1282 DISCH_THEN(MP_TAC o MATCH_MP HAS_INTEGRAL_NEG) THEN
1283 REWRITE_TAC[VECTOR_NEG_NEG] THEN MATCH_MP_TAC EQ_IMP THEN
1284 MATCH_MP_TAC HAS_INTEGRAL_SPIKE_EQ THEN FIRST_ASSUM MP_TAC THEN
1285 REWRITE_TAC[valid_path; piecewise_differentiable_on] THEN
1286 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1287 MATCH_MP_TAC MONO_EXISTS THEN SIMP_TAC[NEGLIGIBLE_FINITE] THEN
1288 GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1289 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `t:real^1` THEN
1290 REWRITE_TAC[IN_DIFF] THEN
1291 DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
1292 DISCH_TAC THEN REWRITE_TAC[o_DEF; GSYM COMPLEX_MUL_RNEG] THEN
1293 AP_TERM_TAC THEN MATCH_MP_TAC VECTOR_DERIVATIVE_WITHIN_CLOSED_INTERVAL THEN
1294 ASM_REWRITE_TAC[DROP_VEC; REAL_LT_01] THEN
1295 MATCH_MP_TAC HAS_VECTOR_DERIVATIVE_NEG THEN
1296 ASM_SIMP_TAC[GSYM VECTOR_DERIVATIVE_WORKS; DIFFERENTIABLE_AT_WITHIN]);;
1298 let WINDING_NUMBER_NEGATEPATH = prove
1299 (`!g z. valid_path g /\ ~(Cx(&0) IN path_image g)
1300 ==> winding_number((--) o g,Cx(&0)) = winding_number(g,Cx(&0))`,
1301 REPEAT STRIP_TAC THEN
1302 ASM_SIMP_TAC[WINDING_NUMBER_VALID_PATH; VALID_PATH_NEGATEPATH;
1303 PATH_IMAGE_NEGATEPATH; IN_IMAGE; UNWIND_THM2;
1304 COMPLEX_RING `Cx(&0) = --x <=> x = Cx(&0)`] THEN
1305 AP_TERM_TAC THEN MATCH_MP_TAC PATH_INTEGRAL_UNIQUE THEN
1306 MATCH_MP_TAC HAS_PATH_INTEGRAL_NEGATEPATH THEN
1307 ASM_REWRITE_TAC[COMPLEX_RING `--z - Cx(&0) = --(z - Cx(&0))`] THEN
1308 REWRITE_TAC[complex_div; COMPLEX_INV_NEG; COMPLEX_MUL_RNEG] THEN
1309 MATCH_MP_TAC HAS_PATH_INTEGRAL_NEG THEN
1310 MATCH_MP_TAC HAS_PATH_INTEGRAL_INTEGRAL THEN
1311 ASM_SIMP_TAC[GSYM complex_div; PATH_INTEGRABLE_INVERSEDIFF]);;
1313 let PATH_INTEGRABLE_NEGATEPATH = prove
1314 (`!g z. valid_path g /\ (\z. f(--z)) path_integrable_on g
1315 ==> f path_integrable_on ((--) o g)`,
1316 REWRITE_TAC[path_integrable_on] THEN
1317 MESON_TAC[HAS_PATH_INTEGRAL_NEGATEPATH; COMPLEX_NEG_NEG]);;
1319 (* ------------------------------------------------------------------------- *)
1320 (* Some bounding lemmas given by Newman. BOUND_LEMMA_2 is my variant since I *)
1321 (* use a slightly different contour. *)
1322 (* ------------------------------------------------------------------------- *)
1324 let BOUND_LEMMA_0 = prove
1326 ==> Cx(&1) / z + z / Cx(R) pow 2 = Cx(&2 * Re z / R pow 2)`,
1327 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[complex_div; COMPLEX_MUL_LID] THEN
1328 REWRITE_TAC[GSYM complex_div] THEN ASM_REWRITE_TAC[COMPLEX_INV_CNJ] THEN
1329 ASM_REWRITE_TAC[complex_div; GSYM COMPLEX_ADD_RDISTRIB] THEN
1330 REWRITE_TAC[COMPLEX_ADD_CNJ; COMPLEX_NORM_MUL] THEN
1331 REWRITE_TAC[COMPLEX_NORM_CX; COMPLEX_NORM_INV; COMPLEX_NORM_POW] THEN
1332 REWRITE_TAC[CX_MUL; CX_DIV; CX_POW; complex_div; GSYM COMPLEX_MUL_ASSOC]);;
1334 let BOUND_LEMMA_1 = prove
1336 ==> norm(Cx(&1) / z + z / Cx(R) pow 2) = &2 * abs(Re z) / R pow 2`,
1337 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[BOUND_LEMMA_0; COMPLEX_NORM_CX] THEN
1338 ASM_REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_DIV; REAL_ABS_POW; REAL_ABS_NUM] THEN
1339 ASM_MESON_TAC[NORM_ARITH `norm z = R ==> abs R = R`]);;
1341 let BOUND_LEMMA_2 = prove
1342 (`!R x z. Re(z) = --x /\ abs(Im(z)) = R /\ &0 <= x /\ &0 < R
1343 ==> norm (Cx (&1) / z + z / Cx R pow 2) <= &2 * x / R pow 2`,
1344 REPEAT STRIP_TAC THEN
1345 REWRITE_TAC[NORM_LE_SQUARE; COMPLEX_SQNORM; DOT_SQUARE_NORM] THEN
1346 REWRITE_TAC[REAL_ARITH `&0 <= &2 * x <=> &0 <= x`] THEN
1347 ASM_SIMP_TAC[REAL_POS; REAL_LE_DIV; REAL_LT_IMP_LE; REAL_POW_LT] THEN
1348 REWRITE_TAC[complex_div] THEN
1349 SUBST1_TAC(SPEC `z:complex` COMPLEX_INV_CNJ) THEN
1350 ASM_SIMP_TAC[cnj; RE; IM; COMPLEX_MUL_LID; REAL_LE_MUL; REAL_POS] THEN
1351 REWRITE_TAC[GSYM CX_POW; COMPLEX_SQNORM; RE; IM] THEN
1352 ASM_REWRITE_TAC[REAL_RING `(--x:real) pow 2 = x pow 2`] THEN
1353 REWRITE_TAC[GSYM CX_INV; complex_div] THEN
1354 REWRITE_TAC[complex_mul; complex_add; RE; IM; RE_CX; IM_CX;
1355 REAL_MUL_RZERO; REAL_SUB_RZERO; REAL_ADD_LID] THEN
1356 ASM_REWRITE_TAC[REAL_RING `(--x:real) pow 2 = x pow 2`;
1357 REAL_RING `(--x * a + --x * b:real) pow 2 = x pow 2 * (a + b) pow 2`;
1358 REAL_RING `(--R * a + R * b:real) pow 2 = R pow 2 * (b - a) pow 2`] THEN
1359 SUBGOAL_THEN `&0 < x pow 2 + R pow 2` ASSUME_TAC THENL
1360 [MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ &0 < y ==> &0 < x + y`) THEN
1361 ASM_SIMP_TAC[REAL_POW_LT] THEN REWRITE_TAC[REAL_POW_2; REAL_LE_SQUARE];
1363 SUBGOAL_THEN `Im z pow 2 = R pow 2` SUBST1_TAC THENL
1364 [ASM_MESON_TAC[REAL_POW2_ABS]; ALL_TAC] THEN
1365 ASM_SIMP_TAC[REAL_POW_LT; REAL_FIELD
1366 `&0 < R pow 2 /\ &0 < x pow 2 + R pow 2
1367 ==> x pow 2 * (inv (x pow 2 + R pow 2) + inv (R pow 2)) pow 2 +
1368 R pow 2 * (inv (R pow 2) - inv (x pow 2 + R pow 2)) pow 2 =
1369 (x pow 4 + &5 * R pow 2 * x pow 2 + &4 * R pow 4) /
1370 (x pow 2 + R pow 2) pow 2 *
1371 (x pow 2 / R pow 4)`] THEN
1372 ASM_SIMP_TAC[REAL_POW_LT; REAL_FIELD
1373 `&0 < R pow 2 ==> (&2 * x / R pow 2) pow 2 = &4 * x pow 2 / R pow 4`] THEN
1374 MATCH_MP_TAC REAL_LE_RMUL THEN
1375 ASM_SIMP_TAC[REAL_LE_DIV; REAL_POW_LE; REAL_LT_IMP_LE] THEN
1376 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_POW_LT] THEN
1377 ONCE_REWRITE_TAC[GSYM REAL_SUB_LE] THEN
1378 CONV_TAC(RAND_CONV REAL_POLY_CONV) THEN
1379 REPEAT(MATCH_MP_TAC REAL_LE_ADD THEN CONJ_TAC) THEN
1380 REPEAT(MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC) THEN
1381 ASM_SIMP_TAC[REAL_POS; REAL_POW_LE; REAL_LT_IMP_LE]);;
1383 let BOUND_LEMMA_3 = prove
1384 (`!a n. (!m. 1 <= m ==> norm(a(m)) <= &1) /\
1385 1 <= n /\ &1 <= Re w /\ &0 < Re z
1386 ==> norm(vsum(1..n) (\n. a(n) / Cx(&n) cpow (w - z)))
1387 <= exp(Re(z) * log(&n)) * (&1 / &n + &1 / Re(z))`,
1391 ==> sum(1..n) (\n. exp((x - &1) * log(&n))) <=
1392 exp(x * log(&n + &1)) / x`,
1393 REPEAT STRIP_TAC THEN DISJ_CASES_TAC(ARITH_RULE `n = 0 \/ 1 <= n`) THENL
1394 [ASM_REWRITE_TAC[NUMSEG_CLAUSES; ARITH; SUM_CLAUSES] THEN
1395 MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_EXP_POS_LE] THEN
1396 UNDISCH_TAC `&1 <= x` THEN REAL_ARITH_TAC;
1399 [`\n. n cpow (Cx(x) - Cx(&1))`;
1400 `\n. n cpow (Cx(x)) / (Cx(x))`;
1402 SUM_INTEGRAL_UBOUND_INCREASING) THEN
1403 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
1405 [X_GEN_TAC `u:complex` THEN STRIP_TAC THEN COMPLEX_DIFF_TAC THEN
1407 [SUBGOAL_THEN `?y. u = Cx y` (CHOOSE_THEN SUBST_ALL_TAC) THENL
1408 [ASM_MESON_TAC[REAL_SEGMENT; REAL_CX; REAL]; ALL_TAC] THEN
1409 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_SEGMENT_CX]) THEN
1410 REWRITE_TAC[RE_CX] THEN REAL_ARITH_TAC;
1412 SUBGOAL_THEN `~(Cx x = Cx(&0))` MP_TAC THENL
1413 [REWRITE_TAC[CX_INJ] THEN UNDISCH_TAC `&1 <= x` THEN REAL_ARITH_TAC;
1414 CONV_TAC COMPLEX_FIELD];
1416 MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN
1418 SUBGOAL_THEN `&1 <= b` ASSUME_TAC THENL
1419 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
1420 ASM_SIMP_TAC[GSYM CX_SUB; CPOW_REAL_REAL; REAL_CX; RE_CX;
1421 REAL_ARITH `&1 <= x ==> &0 < x`] THEN
1422 REWRITE_TAC[REAL_EXP_MONO_LE] THEN
1423 MATCH_MP_TAC REAL_LE_LMUL THEN
1424 CONJ_TAC THENL [ALL_TAC; MATCH_MP_TAC LOG_MONO_LE_IMP] THEN
1427 MATCH_MP_TAC(REAL_ARITH `x = y /\ u <= v ==> x <= u ==> y <= v`) THEN
1429 [MATCH_MP_TAC SUM_EQ_NUMSEG THEN
1430 REWRITE_TAC[GSYM CX_SUB];
1432 ASM_SIMP_TAC[CPOW_REAL_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT;
1433 ARITH_RULE `0 < n <=> 1 <= n`;
1434 REAL_ARITH `&0 < &n + &1`] THEN
1435 REWRITE_TAC[CPOW_1] THEN
1436 REWRITE_TAC[GSYM CX_DIV; GSYM CX_SUB; RE_CX] THEN
1437 MATCH_MP_TAC(REAL_ARITH `&0 <= y ==> x - y <= x`) THEN
1438 REWRITE_TAC[real_div; REAL_MUL_LID; REAL_LE_INV_EQ] THEN
1439 UNDISCH_TAC `&1 <= x` THEN REAL_ARITH_TAC)
1443 ==> sum(1..n) (\n. exp((x - &1) * log(&n))) <=
1444 exp(x * log(&n)) / x`,
1445 REPEAT STRIP_TAC THEN
1446 DISJ_CASES_TAC(ARITH_RULE `n = 0 \/ 1 <= n`) THENL
1447 [ASM_REWRITE_TAC[NUMSEG_CLAUSES; ARITH; SUM_CLAUSES] THEN
1448 ASM_SIMP_TAC[REAL_LE_DIV; REAL_EXP_POS_LE; REAL_LT_IMP_LE];
1450 ASM_SIMP_TAC[SUM_CLAUSES_LEFT] THEN
1451 REWRITE_TAC[LOG_1; REAL_MUL_RZERO; REAL_EXP_0; ARITH] THEN
1452 ASM_CASES_TAC `2 <= n` THENL
1454 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_LE]) THEN
1455 SIMP_TAC[GSYM NUMSEG_EMPTY; SUM_CLAUSES] THEN DISCH_THEN(K ALL_TAC) THEN
1456 SUBGOAL_THEN `n = 1` SUBST1_TAC THENL
1457 [ASM_ARITH_TAC; ALL_TAC] THEN
1458 ASM_SIMP_TAC[LOG_1; REAL_MUL_RZERO; REAL_EXP_0; real_div; REAL_MUL_LID;
1459 REAL_ADD_RID; REAL_INV_1_LE]] THEN
1461 [`\n. n cpow (Cx(x) - Cx(&1))`;
1462 `\n. n cpow (Cx(x)) / (Cx(x))`;
1464 SUM_INTEGRAL_UBOUND_DECREASING) THEN
1465 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
1466 [CONV_TAC REAL_RAT_REDUCE_CONV THEN CONJ_TAC THENL
1467 [X_GEN_TAC `u:complex` THEN STRIP_TAC THEN COMPLEX_DIFF_TAC THEN
1469 [SUBGOAL_THEN `?y. u = Cx y` (CHOOSE_THEN SUBST_ALL_TAC) THENL
1470 [ASM_MESON_TAC[REAL_SEGMENT; REAL_CX; REAL]; ALL_TAC] THEN
1471 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_SEGMENT_CX]) THEN
1472 REWRITE_TAC[RE_CX] THEN
1473 REPEAT(FIRST_X_ASSUM(MP_TAC o
1474 GEN_REWRITE_RULE I [GSYM REAL_OF_NUM_LE])) THEN
1477 SUBGOAL_THEN `~(Cx x = Cx(&0))` MP_TAC THENL
1478 [REWRITE_TAC[CX_INJ] THEN UNDISCH_TAC `&0 < x` THEN REAL_ARITH_TAC;
1479 CONV_TAC COMPLEX_FIELD];
1481 MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN
1483 SUBGOAL_THEN `&1 <= b` ASSUME_TAC THENL
1484 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
1485 ASM_SIMP_TAC[GSYM CX_SUB; CPOW_REAL_REAL; REAL_CX; RE_CX;
1486 REAL_ARITH `&1 <= x ==> &0 < x`] THEN
1487 REWRITE_TAC[REAL_EXP_MONO_LE] THEN
1488 MATCH_MP_TAC(REAL_ARITH
1489 `(&1 - x) * a <= (&1 - x) * b ==> (x - &1) * b <= (x - &1) * a`) THEN
1490 MATCH_MP_TAC REAL_LE_LMUL THEN
1491 CONJ_TAC THENL [ALL_TAC; MATCH_MP_TAC LOG_MONO_LE_IMP] THEN
1494 MATCH_MP_TAC(REAL_ARITH
1495 `x = y /\ &1 + u <= v ==> x <= u ==> &1 + y <= v`) THEN
1496 CONV_TAC REAL_RAT_REDUCE_CONV THEN
1497 REWRITE_TAC[CPOW_1] THEN CONJ_TAC THENL
1498 [MATCH_MP_TAC SUM_EQ_NUMSEG THEN
1499 REWRITE_TAC[GSYM CX_SUB];
1501 ASM_SIMP_TAC[CPOW_REAL_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT;
1502 ARITH_RULE `2 <= i ==> 0 < i`] THEN
1503 REWRITE_TAC[GSYM CX_DIV; GSYM CX_SUB; RE_CX] THEN
1504 MATCH_MP_TAC(REAL_ARITH `&1 <= x ==> &1 + a - x <= a`) THEN
1505 ASM_SIMP_TAC[REAL_INV_1_LE; real_div; REAL_MUL_LID]) in
1506 REPEAT STRIP_TAC THEN
1507 MATCH_MP_TAC REAL_LE_TRANS THEN
1508 EXISTS_TAC `sum(1..n) (\n. exp((Re(z) - &1) * log(&n)))` THEN
1510 [MATCH_MP_TAC VSUM_NORM_LE THEN REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN
1511 X_GEN_TAC `m:num` THEN STRIP_TAC THEN
1512 ASM_SIMP_TAC[COMPLEX_NORM_DIV; NORM_CPOW_REAL; REAL_CX;
1513 RE_CX; REAL_OF_NUM_LT; ARITH_RULE `0 < k <=> 1 <= k`] THEN
1514 REWRITE_TAC[real_div; GSYM REAL_EXP_NEG] THEN
1515 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
1516 MATCH_MP_TAC REAL_LE_MUL2 THEN
1517 ASM_SIMP_TAC[NORM_POS_LE; REAL_EXP_POS_LE; REAL_EXP_MONO_LE] THEN
1518 REWRITE_TAC[GSYM REAL_MUL_LNEG] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
1519 ASM_SIMP_TAC[LOG_POS; REAL_OF_NUM_LE; GSYM RE_NEG; COMPLEX_NEG_SUB] THEN
1520 REWRITE_TAC[RE_SUB] THEN UNDISCH_TAC `&1 <= Re w` THEN REAL_ARITH_TAC;
1522 ABBREV_TAC `x = Re z` THEN
1523 DISJ_CASES_TAC(ARITH_RULE `x <= &1 \/ &1 <= x`) THENL
1524 [MATCH_MP_TAC REAL_LE_TRANS THEN
1525 EXISTS_TAC `exp(x * log(&n)) / x` THEN
1526 ASM_SIMP_TAC[lemma1'] THEN
1527 REWRITE_TAC[real_div; REAL_MUL_LID; REAL_ADD_LDISTRIB] THEN
1528 REWRITE_TAC[REAL_ARITH `x <= a + x <=> &0 <= a`] THEN
1529 ASM_SIMP_TAC[REAL_LE_MUL; REAL_EXP_POS_LE; REAL_LE_INV_EQ; REAL_POS];
1530 ASM_SIMP_TAC[SUM_CLAUSES_RIGHT; LE_1] THEN
1531 MATCH_MP_TAC(REAL_ARITH
1532 `b <= x * a /\ c <= x * d ==> c + b <= x * (a + d)`) THEN
1534 [REWRITE_TAC[REAL_SUB_RDISTRIB; REAL_EXP_SUB; REAL_MUL_LID] THEN
1535 ASM_SIMP_TAC[real_div; REAL_MUL_LID; EXP_LOG; REAL_OF_NUM_LT;
1536 ARITH_RULE `0 < n <=> 1 <= n`; REAL_LE_REFL];
1538 MATCH_MP_TAC REAL_LE_TRANS THEN
1539 EXISTS_TAC `exp(x * log(&(n - 1) + &1)) / x` THEN CONJ_TAC THEN
1540 ASM_SIMP_TAC[lemma1] THEN REWRITE_TAC[REAL_OF_NUM_ADD] THEN
1541 ASM_SIMP_TAC[ARITH_RULE `1 <= n ==> n - 1 + 1 = n`] THEN
1542 REWRITE_TAC[REAL_LE_REFL; real_div; REAL_MUL_LID]]);;
1544 let BOUND_LEMMA_4 = prove
1545 (`!a n m. (!m. 1 <= m ==> norm(a(m)) <= &1) /\
1546 1 <= n /\ &1 <= Re w /\ &0 < Re z
1547 ==> norm(vsum(n+1..m) (\n. a(n) / Cx(&n) cpow (w + z)))
1548 <= &1 / (Re z * exp(Re z * log(&n)))`,
1549 REPEAT STRIP_TAC THEN
1550 MATCH_MP_TAC REAL_LE_TRANS THEN
1551 EXISTS_TAC `sum(n+1..m) (\n. &1 / exp((Re(z) + &1) * log(&n)))` THEN
1553 [MATCH_MP_TAC VSUM_NORM_LE THEN REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN
1554 X_GEN_TAC `r:num` THEN STRIP_TAC THEN
1555 SUBGOAL_THEN `0 < r /\ 1 <= r` STRIP_ASSUME_TAC THENL
1556 [ASM_ARITH_TAC; ALL_TAC] THEN
1557 ASM_SIMP_TAC[COMPLEX_NORM_DIV; NORM_CPOW_REAL; REAL_CX;
1558 RE_CX; REAL_OF_NUM_LT] THEN
1559 REWRITE_TAC[real_div; GSYM REAL_EXP_NEG] THEN
1560 MATCH_MP_TAC REAL_LE_MUL2 THEN
1561 ASM_SIMP_TAC[NORM_POS_LE; REAL_EXP_POS_LE; REAL_EXP_MONO_LE] THEN
1562 REWRITE_TAC[GSYM REAL_MUL_LNEG] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
1563 ASM_SIMP_TAC[LOG_POS; REAL_OF_NUM_LE; RE_NEG; COMPLEX_NEG_SUB] THEN
1564 REWRITE_TAC[RE_ADD; REAL_LE_NEG2] THEN
1565 UNDISCH_TAC `&1 <= Re w` THEN REAL_ARITH_TAC;
1567 ABBREV_TAC `x = Re z` THEN
1568 ASM_CASES_TAC `n + 1 <= m` THENL
1570 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_LE]) THEN
1571 SIMP_TAC[GSYM NUMSEG_EMPTY; SUM_CLAUSES] THEN DISCH_THEN(K ALL_TAC) THEN
1572 ASM_SIMP_TAC[real_div; REAL_MUL_LID; REAL_LE_INV_EQ; REAL_LE_MUL;
1573 REAL_EXP_POS_LE; REAL_LT_IMP_LE]] THEN
1575 [`\n. n cpow (--(Cx(x) + Cx(&1)))`;
1576 `\n. --(n cpow (--(Cx(x)))) / Cx(x)`;
1578 SUM_INTEGRAL_UBOUND_DECREASING) THEN
1579 ASM_REWRITE_TAC[GSYM REAL_OF_NUM_ADD; REAL_ARITH `(x + &1) - &1 = x`] THEN
1581 [CONV_TAC REAL_RAT_REDUCE_CONV THEN CONJ_TAC THENL
1582 [X_GEN_TAC `u:complex` THEN STRIP_TAC THEN COMPLEX_DIFF_TAC THEN
1584 [SUBGOAL_THEN `?y. u = Cx y` (CHOOSE_THEN SUBST_ALL_TAC) THENL
1585 [ASM_MESON_TAC[REAL_SEGMENT; REAL_CX; REAL]; ALL_TAC] THEN
1586 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_SEGMENT_CX]) THEN
1587 REWRITE_TAC[RE_CX] THEN
1588 REPEAT(FIRST_X_ASSUM(MP_TAC o
1589 GEN_REWRITE_RULE I [GSYM REAL_OF_NUM_LE])) THEN
1590 REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC;
1592 REWRITE_TAC[COMPLEX_RING `--x - Cx(&1) = --(x + Cx(&1))`] THEN
1593 SUBGOAL_THEN `~(Cx x = Cx(&0))` MP_TAC THENL
1594 [REWRITE_TAC[CX_INJ] THEN UNDISCH_TAC `&0 < x` THEN REAL_ARITH_TAC;
1595 CONV_TAC COMPLEX_FIELD];
1597 MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN STRIP_TAC THEN
1598 SUBGOAL_THEN `&0 < a /\ &0 < b` STRIP_ASSUME_TAC THENL
1599 [REPEAT(FIRST_X_ASSUM(MP_TAC o
1600 GEN_REWRITE_RULE I [GSYM REAL_OF_NUM_LE])) THEN
1603 REWRITE_TAC[GSYM CX_ADD; GSYM CX_NEG] THEN
1604 ASM_SIMP_TAC[CPOW_REAL_REAL; REAL_CX; RE_CX] THEN
1605 REWRITE_TAC[REAL_EXP_MONO_LE] THEN
1606 MATCH_MP_TAC(REAL_ARITH `x * a <= x * b ==> --x * b <= --x * a`) THEN
1607 MATCH_MP_TAC REAL_LE_LMUL THEN
1608 CONJ_TAC THENL [ALL_TAC; MATCH_MP_TAC LOG_MONO_LE_IMP] THEN
1611 MATCH_MP_TAC(REAL_ARITH
1612 `x = y /\ u <= v ==> x <= u ==> y <= v`) THEN
1614 [MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN
1615 REWRITE_TAC[GSYM CX_ADD; GSYM CX_NEG] THEN
1616 SUBGOAL_THEN `&0 < &k` ASSUME_TAC THENL
1617 [REWRITE_TAC[REAL_OF_NUM_LT] THEN ASM_ARITH_TAC;
1619 ASM_SIMP_TAC[CPOW_REAL_REAL; RE_CX; REAL_CX] THEN
1620 REWRITE_TAC[real_div; REAL_MUL_LID; GSYM REAL_EXP_NEG] THEN
1621 REWRITE_TAC[REAL_MUL_LNEG; REAL_LE_REFL];
1623 REWRITE_TAC[CPOW_NEG] THEN
1624 FIRST_ASSUM(ASSUME_TAC o MATCH_MP (ARITH_RULE `n + 1 <= m ==> 0 < m`)) THEN
1625 FIRST_ASSUM(ASSUME_TAC o MATCH_MP (ARITH_RULE `1 <= n ==> 0 < n`)) THEN
1626 ASM_SIMP_TAC[CPOW_REAL_REAL; RE_CX; REAL_CX; REAL_OF_NUM_LT] THEN
1627 REWRITE_TAC[GSYM CX_INV; GSYM CX_SUB; RE_CX; GSYM CX_DIV; GSYM CX_NEG] THEN
1628 REWRITE_TAC[real_div; REAL_MUL_LNEG; REAL_SUB_NEG2; REAL_MUL_LID] THEN
1629 REWRITE_TAC[GSYM REAL_INV_MUL] THEN
1630 MATCH_MP_TAC(REAL_ARITH `x = z /\ &0 <= y ==> x - y <= z`) THEN
1631 CONJ_TAC THENL [REWRITE_TAC[REAL_MUL_AC]; ALL_TAC] THEN
1632 ASM_SIMP_TAC[REAL_LE_INV_EQ; REAL_LE_MUL; REAL_LT_IMP_LE; REAL_EXP_POS_LE]);;
1634 (* ------------------------------------------------------------------------- *)
1635 (* Our overall bound does go to zero as N increases. *)
1636 (* ------------------------------------------------------------------------- *)
1638 let OVERALL_BOUND_LEMMA = prove
1642 ==> abs(&2 * pi / &n +
1643 &6 * M * R / (d * exp (d * log (&n))) +
1644 &4 * M / (R * log (&n)) pow 2) < e`,
1645 ONCE_REWRITE_TAC[REAL_ARITH `abs x = abs(x - &0)`] THEN
1646 REWRITE_TAC[GSYM REALLIM_SEQUENTIALLY] THEN
1647 REPEAT STRIP_TAC THEN REWRITE_TAC[real_div; REAL_INV_MUL] THEN
1648 REPEAT(MATCH_MP_TAC REALLIM_NULL_ADD THEN CONJ_TAC) THEN
1649 REWRITE_TAC[REAL_MUL_ASSOC; GSYM REAL_POW_INV] THEN
1650 MATCH_MP_TAC REALLIM_NULL_LMUL THEN REWRITE_TAC[REALLIM_1_OVER_N] THENL
1651 [MP_TAC(SPEC `Cx d` LIM_1_OVER_POWER) THEN ASM_REWRITE_TAC[RE_CX] THEN
1652 REWRITE_TAC[REALLIM_COMPLEX; o_DEF] THEN
1653 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] LIM_TRANSFORM_EVENTUALLY) THEN
1654 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN
1655 SIMP_TAC[CPOW_REAL_REAL; RE_CX; REAL_CX; REAL_OF_NUM_LT; CX_INV; LE_1;
1656 complex_div; COMPLEX_MUL_LID];
1657 MATCH_MP_TAC REALLIM_NULL_POW THEN REWRITE_TAC[REAL_INV_MUL; ARITH] THEN
1658 MATCH_MP_TAC REALLIM_NULL_LMUL THEN REWRITE_TAC[REALLIM_1_OVER_LOG]]);;
1660 (* ------------------------------------------------------------------------- *)
1661 (* Newman/Ingham analytic lemma (as in Newman's book). *)
1662 (* ------------------------------------------------------------------------- *)
1664 let NEWMAN_INGHAM_THEOREM = prove
1665 (`!f a. (!n. 1 <= n ==> norm(a(n)) <= &1) /\
1666 f analytic_on {z | Re(z) >= &1} /\
1667 (!z. Re(z) > &1 ==> ((\n. a(n) / Cx(&n) cpow z) sums (f z)) (from 1))
1669 ==> ((\n. a(n) / Cx(&n) cpow z) sums (f z)) (from 1)`,
1670 REWRITE_TAC[real_ge; analytic_on; IN_ELIM_THM] THEN
1671 REPEAT GEN_TAC THEN STRIP_TAC THEN
1672 X_GEN_TAC `w:complex` THEN DISCH_TAC THEN
1673 FIRST_X_ASSUM(DISJ_CASES_TAC o MATCH_MP (REAL_ARITH
1674 `&1 <= w ==> w > &1 \/ w = &1`)) THEN ASM_SIMP_TAC[] THEN
1675 REWRITE_TAC[sums; LIM_SEQUENTIALLY] THEN
1676 X_GEN_TAC `e:real` THEN STRIP_TAC THEN
1677 ABBREV_TAC `R = max (&3 / e) (&1)` THEN
1678 SUBGOAL_THEN `&0 < R` ASSUME_TAC THENL
1679 [EXPAND_TAC "R" THEN REAL_ARITH_TAC; ALL_TAC] THEN
1681 `?d. &0 < d /\ d <= R /\
1682 (\z. f(w + z)) holomorphic_on {z | Re(z) >= --d /\ abs(Im z) <= R}`
1683 (X_CHOOSE_THEN `d:real` (CONJUNCTS_THEN2 ASSUME_TAC
1684 (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "2"))))
1688 (\z. f(w + z)) holomorphic_on {z | Re(z) >= --d /\ abs(Im z) <= R}`
1689 (X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC)
1692 EXISTS_TAC `min d R` THEN ASM_REWRITE_TAC[REAL_LT_MIN] THEN
1693 CONJ_TAC THENL [ARITH_TAC; ALL_TAC] THEN
1694 MATCH_MP_TAC HOLOMORPHIC_ON_SUBSET THEN
1695 EXISTS_TAC `{z | Re(z) >= --d /\ abs(Im z) <= R}` THEN
1696 ASM_REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN REAL_ARITH_TAC] THEN
1697 ABBREV_TAC `g = \z. (f:complex->complex) (w + z)` THEN
1699 `!z. &0 <= Re z ==> ?e. &0 < e /\ g holomorphic_on ball (z,e)`
1701 [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
1703 `!z. &1 <= Re z ==> (?e. &0 < e /\ f holomorphic_on ball (z,e))` THEN
1704 DISCH_THEN(MP_TAC o SPEC `w + z:complex`) THEN
1705 ASM_SIMP_TAC[RE_ADD;REAL_ARITH `&0 <= z ==> &1 <= &1 + z`] THEN
1706 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN STRIP_TAC THEN
1707 ASM_REWRITE_TAC[] THEN EXPAND_TAC "g" THEN
1708 ONCE_REWRITE_TAC[GSYM o_DEF] THEN MATCH_MP_TAC HOLOMORPHIC_ON_COMPOSE THEN
1709 SIMP_TAC[HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_ID; HOLOMORPHIC_ON_CONST] THEN
1710 UNDISCH_TAC `f holomorphic_on ball(w + z,d)` THEN MATCH_MP_TAC EQ_IMP THEN
1711 AP_TERM_TAC THEN REWRITE_TAC[EXTENSION; IN_BALL; IN_IMAGE] THEN
1712 REWRITE_TAC[COMPLEX_RING `x:complex = w + y <=> x - w = y`] THEN
1713 REWRITE_TAC[UNWIND_THM1] THEN NORM_ARITH_TAC;
1715 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [RIGHT_IMP_EXISTS_THM] THEN
1716 REWRITE_TAC[SKOLEM_THM] THEN
1717 DISCH_THEN(X_CHOOSE_TAC `bs:complex->real`) THEN
1718 MP_TAC(ISPECL [`complex(&0,--R)`; `complex(&0,R)`] COMPACT_INTERVAL) THEN
1719 REWRITE_TAC[COMPACT_EQ_HEINE_BOREL] THEN
1720 DISCH_THEN(MP_TAC o SPEC
1721 `IMAGE (\z. {w | abs(Re(z - w)) < bs z / &2 /\ abs(Im(z - w)) < bs z / &2})
1722 (interval[complex(&0,--R),complex(&0,R)])`) THEN
1725 [REWRITE_TAC[FORALL_IN_IMAGE] THEN REPEAT STRIP_TAC THEN
1726 REWRITE_TAC[RE_SUB; IM_SUB; REAL_ARITH
1727 `abs(x - a) < e /\ abs(y - b) < e <=>
1728 a < x + e /\ a > x - e /\ b < y + e /\ b > y - e`] THEN
1729 SIMP_TAC[SET_RULE `{x | P x /\ Q x} = {x | P x} INTER {x | Q x}`] THEN
1730 REPEAT(MATCH_MP_TAC OPEN_INTER THEN STRIP_TAC) THEN
1731 REWRITE_TAC[OPEN_HALFSPACE_IM_GT; OPEN_HALFSPACE_IM_LT;
1732 OPEN_HALFSPACE_RE_GT; OPEN_HALFSPACE_RE_LT];
1734 MATCH_MP_TAC(SET_RULE
1735 `(!x. x IN s ==> x IN g x) ==> s SUBSET (UNIONS (IMAGE g s))`) THEN
1736 REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_NORM_0; IN_ELIM_THM] THEN
1737 ASM_REWRITE_TAC[RE_CX; IM_CX; REAL_ABS_NUM] THEN
1738 REWRITE_TAC[IN_INTERVAL; DIMINDEX_2; FORALL_2] THEN
1739 REWRITE_TAC[GSYM RE_DEF; GSYM IM_DEF; RE; IM] THEN
1740 ASM_MESON_TAC[REAL_HALF];
1742 ONCE_REWRITE_TAC[TAUT `a /\ b /\ c <=> c /\ b /\ a`] THEN
1743 REWRITE_TAC[FINITE_SUBSET_IMAGE; RIGHT_AND_EXISTS_THM] THEN
1744 ONCE_REWRITE_TAC[TAUT `a /\ b /\ c /\ d <=> d /\ a /\ b /\ c`] THEN
1745 ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN REWRITE_TAC[UNWIND_THM2] THEN
1746 DISCH_THEN(X_CHOOSE_THEN `t:complex->bool` STRIP_ASSUME_TAC) THEN
1747 EXISTS_TAC `inf (IMAGE (bs:complex->real) t) / &2` THEN
1748 FIRST_ASSUM(MP_TAC o MATCH_MP (SET_RULE
1749 `s SUBSET UNIONS (IMAGE g t) ==> ~(s = {}) ==> ~(t = {})`)) THEN
1751 [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN EXISTS_TAC `complex(&0,&0)` THEN
1752 REWRITE_TAC[IN_INTERVAL; DIMINDEX_2; FORALL_2] THEN
1753 REWRITE_TAC[GSYM RE_DEF; GSYM IM_DEF; RE; IM] THEN
1754 UNDISCH_TAC `&0 < R` THEN REAL_ARITH_TAC;
1756 REWRITE_TAC[REAL_HALF] THEN
1757 ASM_SIMP_TAC[REAL_LT_INF_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY] THEN
1758 REWRITE_TAC[FORALL_IN_IMAGE] THEN CONJ_TAC THENL
1759 [FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
1760 `t SUBSET s ==> (!x. x IN s ==> P x) ==> (!x. x IN t ==> P x)`)) THEN
1761 REWRITE_TAC[IN_INTERVAL; FORALL_2; GSYM RE_DEF; DIMINDEX_2] THEN
1762 REWRITE_TAC[RE] THEN ASM_MESON_TAC[];
1764 REWRITE_TAC[HOLOMORPHIC_ON_DIFFERENTIABLE] THEN X_GEN_TAC `z:complex` THEN
1765 REWRITE_TAC[IN_ELIM_THM; real_ge] THEN STRIP_TAC THEN
1766 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_AT_WITHIN THEN
1767 ASM_CASES_TAC `&0 <= Re z` THENL
1768 [ASM_MESON_TAC[HOLOMORPHIC_ON_OPEN; complex_differentiable; OPEN_BALL;
1771 FIRST_ASSUM(MP_TAC o SPEC `complex(&0,Im z)` o MATCH_MP (SET_RULE
1772 `i SUBSET UNIONS s ==> !x. x IN i ==> x IN UNIONS s`)) THEN
1774 [REWRITE_TAC[IN_INTERVAL; DIMINDEX_2; FORALL_2] THEN
1775 REWRITE_TAC[GSYM RE_DEF; GSYM IM_DEF; RE; IM] THEN
1776 UNDISCH_TAC `abs(Im z) <= R` THEN REAL_ARITH_TAC;
1778 REWRITE_TAC[IN_UNIONS; EXISTS_IN_IMAGE] THEN
1779 DISCH_THEN(X_CHOOSE_THEN `v:complex` MP_TAC) THEN
1780 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1781 SUBGOAL_THEN `Re v = &0` ASSUME_TAC THENL
1782 [UNDISCH_TAC `(v:complex) IN t` THEN
1783 FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
1784 `t SUBSET s ==> (x IN s ==> P x) ==> (x IN t ==> P x)`)) THEN
1785 REWRITE_TAC[IN_INTERVAL; FORALL_2; GSYM RE_DEF; DIMINDEX_2] THEN
1786 REWRITE_TAC[RE] THEN REAL_ARITH_TAC;
1788 ASM_REWRITE_TAC[IN_ELIM_THM; RE_SUB; IM_SUB; RE; IM] THEN
1789 DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN
1791 `!z. &0 <= Re z ==> &0 < bs z /\ g holomorphic_on ball (z,bs z)` THEN
1792 DISCH_THEN(MP_TAC o SPEC `v:complex`) THEN ASM_SIMP_TAC[REAL_LE_REFL] THEN
1793 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
1794 SIMP_TAC[HOLOMORPHIC_ON_OPEN; OPEN_BALL; GSYM complex_differentiable] THEN
1795 DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[IN_BALL] THEN
1796 REWRITE_TAC[dist; complex_norm] THEN
1797 MATCH_MP_TAC(REAL_ARITH `&0 < e /\ x < abs e ==> x < e`) THEN
1798 ASM_REWRITE_TAC[GSYM POW_2_SQRT_ABS] THEN
1799 MATCH_MP_TAC SQRT_MONO_LT THEN
1800 MATCH_MP_TAC(REAL_ARITH
1801 `&0 < b * b /\ x <= (b / &2) pow 2 /\ y <= (b / &2) pow 2
1802 ==> x + y < b pow 2`) THEN
1803 ASM_SIMP_TAC[REAL_LT_MUL; GSYM REAL_LE_SQUARE_ABS] THEN
1804 ASM_SIMP_TAC[IM_SUB; REAL_ARITH `&0 < b ==> abs(b / &2) = b / &2`] THEN
1805 ASM_SIMP_TAC[RE_SUB; REAL_LT_IMP_LE] THEN
1806 FIRST_X_ASSUM(MP_TAC o MATCH_MP (REAL_ARITH
1807 `--(x / &2) <= z ==> &2 * --z <= x`)) THEN
1808 ASM_SIMP_TAC[REAL_LE_INF_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY] THEN
1809 REWRITE_TAC[FORALL_IN_IMAGE] THEN
1810 DISCH_THEN(MP_TAC o SPEC `v:complex`) THEN ASM_REWRITE_TAC[] THEN
1811 UNDISCH_TAC `~(&0 <= Re z)` THEN REAL_ARITH_TAC;
1815 !z. Re z >= --d /\ abs (Im z) <= R /\ Re(z) <= R
1816 ==> norm(f(w + z):complex) <= M`
1817 (X_CHOOSE_THEN `M:real` (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "2a"))) THENL
1818 [MP_TAC(ISPEC `IMAGE (\z. f (w + z):complex)
1819 {z | Re z >= --d /\ abs (Im z) <= R /\ Re(z) <= R}`
1820 COMPACT_IMP_BOUNDED) THEN
1821 REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE; IN_ELIM_THM] THEN
1822 DISCH_THEN MATCH_MP_TAC THEN MATCH_MP_TAC COMPACT_CONTINUOUS_IMAGE THEN
1824 [FIRST_ASSUM(MP_TAC o MATCH_MP HOLOMORPHIC_ON_IMP_CONTINUOUS_ON) THEN
1825 MATCH_MP_TAC(REWRITE_RULE[TAUT `a /\ b ==> c <=> b ==> a ==> c`]
1826 CONTINUOUS_ON_SUBSET) THEN
1829 REWRITE_TAC[COMPACT_EQ_BOUNDED_CLOSED] THEN CONJ_TAC THENL
1830 [MATCH_MP_TAC BOUNDED_SUBSET THEN
1831 EXISTS_TAC `cball(Cx(&0),&2 * R + d)` THEN
1832 REWRITE_TAC[BOUNDED_CBALL; SUBSET; IN_CBALL; dist] THEN
1833 REWRITE_TAC[COMPLEX_SUB_LZERO; NORM_NEG; IN_ELIM_THM] THEN
1834 MP_TAC COMPLEX_NORM_LE_RE_IM THEN MATCH_MP_TAC MONO_FORALL THEN
1835 UNDISCH_TAC `&0 < d` THEN REAL_ARITH_TAC;
1837 REWRITE_TAC[GSYM REAL_BOUNDS_LE; REAL_ARITH `x <= Im z <=> Im z >= x`] THEN
1838 REWRITE_TAC[SET_RULE `{x | P x /\ Q x} = {x | P x} INTER {x | Q x}`] THEN
1839 REPEAT(MATCH_MP_TAC CLOSED_INTER THEN CONJ_TAC) THEN
1840 REWRITE_TAC[CLOSED_HALFSPACE_RE_LE; CLOSED_HALFSPACE_IM_LE;
1841 CLOSED_HALFSPACE_RE_GE; CLOSED_HALFSPACE_IM_GE];
1843 MP_TAC(SPECL [`d:real`; `M:real`; `R:real`] OVERALL_BOUND_LEMMA) THEN
1844 ASM_REWRITE_TAC[] THEN
1845 DISCH_THEN(MP_TAC o SPEC `&2 / &3 * e * pi`) THEN
1846 ASM_SIMP_TAC[REAL_LT_MUL; PI_POS; REAL_ARITH `&0 < &2 / &3`] THEN
1847 DISCH_THEN(X_CHOOSE_THEN `N0:num` (LABEL_TAC "X")) THEN
1848 EXISTS_TAC `N0 + 2` THEN X_GEN_TAC `N:num` THEN DISCH_TAC THEN
1849 REMOVE_THEN "X" (MP_TAC o SPEC `N:num`) THEN
1850 ASM_SIMP_TAC[ARITH_RULE `N0 + 2 <= N ==> N0 <= N`] THEN
1852 SUBGOAL_THEN `~(N = 0) /\ 1 < N` STRIP_ASSUME_TAC THENL
1853 [ASM_ARITH_TAC; ALL_TAC] THEN
1854 REWRITE_TAC[FROM_INTER_NUMSEG] THEN
1855 ABBREV_TAC `S_N(w) = vsum(1..N) (\n. a(n) / Cx(&n) cpow w)` THEN
1856 REWRITE_TAC[dist] THEN ONCE_REWRITE_TAC[NORM_SUB] THEN
1857 ABBREV_TAC `r_N(w) = (f:complex->complex)(w) - S_N(w)` THEN
1858 ABBREV_TAC `A = partcirclepath(Cx(&0),R,--(pi / &2),pi / &2)` THEN
1861 pathstart A = complex(&0,--R) /\
1862 pathfinish A = complex(&0,R) /\
1863 &0 < Re(winding_number(A,Cx(&0)))`
1864 STRIP_ASSUME_TAC THENL
1865 [EXPAND_TAC "A" THEN REWRITE_TAC[VALID_PATH_PARTCIRCLEPATH] THEN
1866 REWRITE_TAC[PATHSTART_PARTCIRCLEPATH; PATHFINISH_PARTCIRCLEPATH] THEN
1867 REWRITE_TAC[CEXP_EULER; SIN_NEG; COS_NEG; SIN_PI2; COS_PI2;
1868 GSYM CX_SIN; GSYM CX_COS] THEN
1869 REWRITE_TAC[COMPLEX_ADD_LID; COMPLEX_MUL_RID] THEN
1870 REWRITE_TAC[COMPLEX_EQ; RE_MUL_CX; RE_II; IM_II; IM_MUL_CX; RE; IM] THEN
1871 REPEAT(CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC]) THEN
1872 MATCH_MP_TAC WINDING_NUMBER_PARTCIRCLEPATH_POS_LT THEN
1873 ASM_REWRITE_TAC[COMPLEX_NORM_0; COMPLEX_SUB_REFL] THEN
1874 MP_TAC PI_POS THEN REAL_ARITH_TAC;
1876 SUBGOAL_THEN `path_image A SUBSET {z | Re(z) >= &0 /\ norm(z) = R}`
1878 [EXPAND_TAC "A" THEN
1879 ASM_SIMP_TAC[PATH_IMAGE_PARTCIRCLEPATH; REAL_LT_IMP_LE; PI_POS;
1880 REAL_ARITH `--p < p <=> &0 < p`; REAL_HALF] THEN
1881 REWRITE_TAC[SUBSET; COMPLEX_ADD_LID; IN_ELIM_THM] THEN
1882 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[RE_MUL_CX; RE_CEXP] THEN
1883 REWRITE_TAC[COMPLEX_NORM_MUL; NORM_CEXP; COMPLEX_NORM_CX; RE_MUL_II] THEN
1884 REWRITE_TAC[IM_CX; REAL_NEG_0; REAL_EXP_0; REAL_MUL_RID] THEN
1885 ASM_SIMP_TAC[REAL_ARITH `&0 < r ==> abs r = r`; real_ge] THEN
1886 MATCH_MP_TAC REAL_LE_MUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN
1887 MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_EXP_POS_LE] THEN
1888 REWRITE_TAC[IM_MUL_II; RE_CX] THEN ASM_SIMP_TAC[COS_POS_PI_LE];
1890 SUBGOAL_THEN `~(Cx(&0) IN path_image A)` ASSUME_TAC THENL
1891 [FIRST_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
1892 `s SUBSET t ==> ~(x IN t) ==> ~(x IN s)`)) THEN
1893 REWRITE_TAC[IN_ELIM_THM; COMPLEX_NORM_0] THEN
1894 UNDISCH_TAC `&0 < R` THEN REAL_ARITH_TAC;
1896 ABBREV_TAC `B = linepath(complex(&0,R),complex(--d,R)) ++
1897 linepath(complex(--d,R),complex(--d,--R)) ++
1898 linepath(complex(--d,--R),complex(&0,--R))` THEN
1901 ~(Cx(&0) IN path_image B) /\
1902 &0 < Re(winding_number(B,Cx(&0)))`
1903 STRIP_ASSUME_TAC THENL
1904 [EXPAND_TAC "B" THEN
1905 REPEAT(MATCH_MP_TAC WINDING_NUMBER_JOIN_POS_COMBINED THEN
1906 REWRITE_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
1907 PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
1909 (REWRITE_TAC[VALID_PATH_LINEPATH] THEN CONJ_TAC THENL
1911 MATCH_MP_TAC WINDING_NUMBER_LINEPATH_POS_LT THEN
1912 REWRITE_TAC[complex_mul; RE; IM; RE_SUB; RE_CNJ; IM_SUB; IM_CNJ;
1914 CONV_TAC(RAND_CONV REAL_POLY_CONV) THEN
1915 ASM_SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT; ARITH]]) THEN
1916 REWRITE_TAC[PATH_IMAGE_LINEPATH; segment; IN_ELIM_THM] THEN
1917 REWRITE_TAC[COMPLEX_EQ; RE_CMUL; RE_ADD; RE_CX; RE;
1918 IM_CMUL; IM_ADD; IM_CX; IM] THEN
1919 REWRITE_TAC[REAL_ARITH `&0 = (&1 - u) * x + u * x <=> x = &0`] THEN
1920 ASM_SIMP_TAC[REAL_NEG_EQ_0; REAL_LT_IMP_NZ];
1923 `pathstart B = complex(&0,R) /\
1924 pathfinish B = complex(&0,--R)`
1925 STRIP_ASSUME_TAC THENL
1926 [EXPAND_TAC "B" THEN
1927 SIMP_TAC[PATHSTART_JOIN; PATHFINISH_JOIN;
1928 PATHSTART_LINEPATH; PATHFINISH_LINEPATH];
1931 `path_image B SUBSET {z | --d <= Re z /\ Re(z) <= &0 /\ abs(Im z) <= R}`
1934 `convex {z | --d <= Re z /\ Re z <= &0 /\ abs (Im z) <= R}`
1936 [REWRITE_TAC[GSYM REAL_BOUNDS_LE;
1937 SET_RULE `{x | P x /\ Q x} = {x | P x} INTER {x | Q x}`] THEN
1938 REPEAT(MATCH_MP_TAC CONVEX_INTER THEN CONJ_TAC) THEN
1939 REWRITE_TAC[REWRITE_RULE[real_ge] CONVEX_HALFSPACE_RE_GE;
1940 REWRITE_RULE[real_ge] CONVEX_HALFSPACE_IM_GE;
1941 CONVEX_HALFSPACE_RE_LE; CONVEX_HALFSPACE_IM_LE];
1944 REPEAT(MATCH_MP_TAC(SET_RULE
1945 `path_image(p1 ++ p2) SUBSET path_image p1 UNION path_image p2 /\
1946 path_image p1 SUBSET s /\ path_image p2 SUBSET s
1947 ==> path_image(p1 ++ p2) SUBSET s`) THEN
1948 REWRITE_TAC[PATH_IMAGE_JOIN_SUBSET] THEN CONJ_TAC) THEN
1949 REWRITE_TAC[PATH_IMAGE_LINEPATH; SEGMENT_CONVEX_HULL] THEN
1950 MATCH_MP_TAC HULL_MINIMAL THEN ASM_REWRITE_TAC[] THEN
1951 REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY] THEN
1952 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[RE; IM] THEN
1953 MAP_EVERY UNDISCH_TAC [`&0 < d`; `&0 < R`] THEN REAL_ARITH_TAC;
1956 `valid_path(A ++ B) /\
1957 pathstart(A ++ B) = complex(&0,--R) /\
1958 pathfinish(A ++ B) = complex(&0,--R) /\
1959 ~(Cx(&0) IN path_image(A ++ B))`
1960 STRIP_ASSUME_TAC THENL
1961 [ASM_SIMP_TAC[VALID_PATH_JOIN; PATHSTART_JOIN; PATHFINISH_JOIN;
1962 PATH_IMAGE_JOIN; IN_UNION; VALID_PATH_IMP_PATH];
1964 SUBGOAL_THEN `winding_number(A++B,Cx(&0)) = Cx(&1)` ASSUME_TAC THENL
1965 [MATCH_MP_TAC WINDING_NUMBER_EQ_1 THEN
1966 ASM_SIMP_TAC[VALID_PATH_IMP_PATH; PATH_IMAGE_JOIN; IN_UNION;
1967 WINDING_NUMBER_JOIN; REAL_LT_ADD; RE_ADD] THEN
1968 MATCH_MP_TAC(REAL_ARITH `x < &1 /\ y < &1 ==> x + y < &2`) THEN
1969 CONJ_TAC THEN MATCH_MP_TAC WINDING_NUMBER_LT_1 THENL
1970 [EXISTS_TAC `--Cx(&1)`; EXISTS_TAC `Cx(&1)`] THEN
1971 ASM_SIMP_TAC[] THEN (CONJ_TAC THENL [CONV_TAC COMPLEX_FIELD; ALL_TAC]) THEN
1972 X_GEN_TAC `t:real` THEN DISCH_TAC THEN
1973 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
1974 `s SUBSET t ==> ~(x IN t) ==> ~(x IN s)`)) THEN
1975 REWRITE_TAC[COMPLEX_ADD_LID; COMPLEX_SUB_RZERO; IN_ELIM_THM] THEN
1976 REWRITE_TAC[COMPLEX_MUL_RNEG; GSYM CX_MUL; RE_CX; IM_CX; RE_NEG] THEN
1977 REWRITE_TAC[NORM_NEG; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
1978 UNDISCH_TAC `&0 < t` THEN REAL_ARITH_TAC;
1981 `((\z. f(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx(R) pow 2))
1982 has_path_integral (Cx(&2) * Cx pi * ii * f(w))) (A ++ B)`
1985 [`\z. f(w + z) * Cx(&N) cpow z * (Cx(&1) + z pow 2 / Cx(R) pow 2)`;
1986 `{z | Re(z) >= --d /\ abs(Im z) <= R}`;
1987 `A ++ B:real^1->complex`;
1989 CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE) THEN
1990 ASM_REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_MUL_LID; CPOW_N] THEN
1991 ASM_REWRITE_TAC[CX_INJ; REAL_OF_NUM_EQ; complex_div] THEN
1992 REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_ADD_RID; complex_pow] THEN
1993 REWRITE_TAC[COMPLEX_RING `Cx(&1) + Cx(&0) pow 2 * z = Cx(&1)`] THEN
1994 REWRITE_TAC[COMPLEX_MUL_RID] THEN ANTS_TAC THENL
1996 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_EQ) THEN
1997 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
1998 ASM_CASES_TAC `z = Cx(&0)` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
1999 UNDISCH_TAC `~(z = Cx(&0))` THEN REWRITE_TAC[] THEN
2000 ABBREV_TAC `wever = inv(Cx R pow 2)` THEN CONV_TAC COMPLEX_FIELD] THEN
2002 [REWRITE_TAC[REAL_ARITH `abs(x) <= a <=> x >= --a /\ x <= a`] THEN
2003 REWRITE_TAC[SET_RULE `{x | P x /\ Q x} = {x | P x} INTER {x | Q x}`] THEN
2004 MATCH_MP_TAC CONVEX_INTER THEN REWRITE_TAC[CONVEX_HALFSPACE_RE_GE] THEN
2005 MATCH_MP_TAC CONVEX_INTER THEN
2006 REWRITE_TAC[CONVEX_HALFSPACE_IM_GE; CONVEX_HALFSPACE_IM_LE];
2009 [MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN ASM_REWRITE_TAC[] THEN
2010 ONCE_REWRITE_TAC[COMPLEX_ADD_SYM] THEN ASM_REWRITE_TAC[] THEN
2011 MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN
2012 SIMP_TAC[HOLOMORPHIC_ON_MUL; HOLOMORPHIC_ON_POW; HOLOMORPHIC_ON_ID;
2013 HOLOMORPHIC_ON_CONST; HOLOMORPHIC_ON_ADD] THEN
2014 REWRITE_TAC[holomorphic_on] THEN X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
2015 EXISTS_TAC `clog(Cx(&N)) * Cx(&N) cpow z` THEN
2016 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_AT_WITHIN THEN
2017 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_CPOW_RIGHT THEN
2018 ASM_REWRITE_TAC[CX_INJ; REAL_OF_NUM_EQ];
2021 [REWRITE_TAC[IN_INTERIOR] THEN EXISTS_TAC `min d R:real` THEN
2022 ASM_REWRITE_TAC[REAL_HALF; REAL_LT_MIN] THEN
2023 REWRITE_TAC[SUBSET; IN_BALL; dist; COMPLEX_SUB_LZERO; NORM_NEG] THEN
2024 REWRITE_TAC[IN_ELIM_THM] THEN GEN_TAC THEN
2025 MATCH_MP_TAC(REAL_ARITH
2026 `abs(n1) <= n /\ abs(n2) <= n
2027 ==> n < min d R ==> n1 >= --d /\ abs n2 <= R`) THEN
2028 REWRITE_TAC[COMPLEX_NORM_GE_RE_IM];
2030 ASM_SIMP_TAC[PATH_IMAGE_JOIN; VALID_PATH_IMP_PATH; UNION_SUBSET] THEN
2031 CONJ_TAC THEN MATCH_MP_TAC(SET_RULE
2032 `~(x IN s) /\ s SUBSET t ==> s SUBSET (t DELETE x)`) THEN
2033 ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
2034 (REWRITE_RULE[IMP_CONJ] SUBSET_TRANS)) THEN
2035 REWRITE_TAC[SUBSET; IN_ELIM_THM] THENL [ALL_TAC; REAL_ARITH_TAC] THEN
2036 MP_TAC COMPLEX_NORM_GE_RE_IM THEN MATCH_MP_TAC MONO_FORALL THEN
2037 UNDISCH_TAC `&0 < d` THEN REAL_ARITH_TAC;
2039 FIRST_ASSUM(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRABLE) THEN
2040 ASM_SIMP_TAC[PATH_INTEGRABLE_JOIN; IMP_CONJ] THEN
2041 REWRITE_TAC[path_integrable_on] THEN
2042 DISCH_THEN(X_CHOOSE_THEN `integral_fA:complex` (LABEL_TAC "fA")) THEN
2043 DISCH_THEN(X_CHOOSE_THEN `integral_fB:complex` (LABEL_TAC "fB")) THEN
2044 SUBGOAL_THEN `integral_fA + integral_fB = Cx(&2) * Cx pi * ii * f(w:complex)`
2046 [MATCH_MP_TAC HAS_PATH_INTEGRAL_UNIQUE THEN MAP_EVERY EXISTS_TAC
2047 [`\z. f(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx R pow 2)`;
2048 `A ++ B:real^1->complex`] THEN
2049 ASM_SIMP_TAC[HAS_PATH_INTEGRAL_JOIN];
2051 ABBREV_TAC `A' = (--) o (A:real^1->complex)` THEN
2054 pathstart A' = complex(&0,R) /\
2055 pathfinish A' = complex(&0,--R) /\
2056 ~(Cx(&0) IN path_image A') /\
2057 &0 < Re(winding_number(A',Cx(&0)))`
2058 STRIP_ASSUME_TAC THENL
2059 [EXPAND_TAC "A'" THEN
2060 ASM_SIMP_TAC[VALID_PATH_NEGATEPATH; PATHSTART_NEGATEPATH;
2061 PATHFINISH_NEGATEPATH; WINDING_NUMBER_NEGATEPATH;
2062 PATH_IMAGE_NEGATEPATH] THEN
2063 REWRITE_TAC[IN_IMAGE; COMPLEX_RING `Cx(&0) = --x <=> x = Cx(&0)`] THEN
2064 ASM_REWRITE_TAC[UNWIND_THM2] THEN
2065 SIMP_TAC[COMPLEX_EQ; RE_NEG; IM_NEG; RE; IM; REAL_NEG_0; REAL_NEGNEG];
2068 `valid_path(A ++ A') /\
2069 pathstart(A ++ A') = complex(&0,--R) /\
2070 pathfinish(A ++ A') = complex(&0,--R) /\
2071 ~(Cx(&0) IN path_image(A ++ A')) /\
2072 path_image(A ++ A') = path_image A UNION path_image A'`
2073 STRIP_ASSUME_TAC THENL
2074 [ASM_SIMP_TAC[VALID_PATH_JOIN; PATHSTART_JOIN; PATHFINISH_JOIN; IN_UNION;
2075 PATH_IMAGE_JOIN; VALID_PATH_IMP_PATH];
2077 SUBGOAL_THEN `path_image A' SUBSET {z | Re z <= &0 /\ norm z = R}`
2079 [EXPAND_TAC "A'" THEN REWRITE_TAC[path_image; IMAGE_o; SUBSET] THEN
2080 ONCE_REWRITE_TAC[FORALL_IN_IMAGE] THEN REWRITE_TAC[GSYM path_image] THEN
2081 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
2082 `s SUBSET t ==> (!x. x IN t ==> P x) ==> (!x. x IN s ==> P x)`)) THEN
2083 REWRITE_TAC[IN_ELIM_THM; RE_NEG; NORM_NEG] THEN REAL_ARITH_TAC;
2085 SUBGOAL_THEN `winding_number(A++A',Cx(&0)) = Cx(&1)` ASSUME_TAC THENL
2086 [MATCH_MP_TAC WINDING_NUMBER_EQ_1 THEN
2087 ASM_SIMP_TAC[VALID_PATH_IMP_PATH; IN_UNION;
2088 VALID_PATH_JOIN; PATHSTART_JOIN; PATHFINISH_JOIN;
2089 WINDING_NUMBER_JOIN; REAL_LT_ADD; RE_ADD] THEN
2090 MATCH_MP_TAC(REAL_ARITH `x < &1 /\ y < &1 ==> x + y < &2`) THEN
2091 CONJ_TAC THEN MATCH_MP_TAC WINDING_NUMBER_LT_1 THENL
2092 [EXISTS_TAC `--Cx(&1)`; EXISTS_TAC `Cx(&1)`] THEN
2093 ASM_SIMP_TAC[] THEN (CONJ_TAC THENL [CONV_TAC COMPLEX_FIELD; ALL_TAC]) THEN
2094 X_GEN_TAC `t:real` THEN DISCH_TAC THEN
2095 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (SET_RULE
2096 `s SUBSET t ==> ~(x IN t) ==> ~(x IN s)`)) THEN
2097 REWRITE_TAC[COMPLEX_ADD_LID; COMPLEX_SUB_RZERO; IN_ELIM_THM] THEN
2098 REWRITE_TAC[COMPLEX_MUL_RNEG; GSYM CX_MUL; RE_CX; IM_CX; RE_NEG] THEN
2099 REWRITE_TAC[NORM_NEG; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
2100 UNDISCH_TAC `&0 < t` THEN REAL_ARITH_TAC;
2103 `(\z. S_N (w + z) * Cx (&N) cpow z * (Cx (&1) + z pow 2 * inv (Cx R pow 2)))
2104 holomorphic_on (:complex)`
2106 [MATCH_MP_TAC HOLOMORPHIC_ON_MUL THEN CONJ_TAC THENL
2107 [REWRITE_TAC[GSYM(ASSUME
2108 `!w. vsum (1..N) (\n. a n / Cx (&n) cpow w) = S_N w`)] THEN
2109 MATCH_MP_TAC HOLOMORPHIC_ON_VSUM THEN
2110 REWRITE_TAC[IN_NUMSEG; FINITE_NUMSEG] THEN
2111 REPEAT STRIP_TAC THEN MATCH_MP_TAC HOLOMORPHIC_ON_DIV;
2112 MATCH_MP_TAC HOLOMORPHIC_ON_MUL] THEN
2113 ASM_SIMP_TAC[HOLOMORPHIC_ON_CPOW_RIGHT; HOLOMORPHIC_ON_ID; CPOW_EQ_0;
2114 HOLOMORPHIC_ON_CONST; REAL_OF_NUM_EQ; HOLOMORPHIC_ON_MUL;
2115 ARITH_RULE `~(n = 0) <=> 1 <= n`;
2116 HOLOMORPHIC_ON_ADD; HOLOMORPHIC_ON_POW; CX_INJ];
2119 `((\z. S_N(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx(R) pow 2))
2120 has_path_integral (Cx(&2) * Cx pi * ii * S_N(w))) (A ++ A')`
2123 [`\z. S_N(w + z) * Cx(&N) cpow z * (Cx(&1) + z pow 2 / Cx(R) pow 2)`;
2125 `A ++ A':real^1->complex`;
2127 CAUCHY_INTEGRAL_FORMULA_CONVEX_SIMPLE) THEN
2128 ASM_REWRITE_TAC[CONVEX_CBALL; INTERIOR_CBALL; CENTRE_IN_BALL] THEN
2129 ASM_REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_MUL_LID; CPOW_N] THEN
2130 ASM_REWRITE_TAC[CX_INJ; REAL_OF_NUM_EQ; complex_div] THEN
2131 REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_ADD_RID; complex_pow] THEN
2132 REWRITE_TAC[COMPLEX_RING `Cx(&1) + Cx(&0) pow 2 * z = Cx(&1)`] THEN
2133 REWRITE_TAC[COMPLEX_MUL_RID] THEN ANTS_TAC THENL
2135 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] HAS_PATH_INTEGRAL_EQ) THEN
2136 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
2137 ASM_CASES_TAC `z = Cx(&0)` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
2138 UNDISCH_TAC `~(z = Cx(&0))` THEN REWRITE_TAC[] THEN
2139 ABBREV_TAC `wever = inv(Cx R pow 2)` THEN CONV_TAC COMPLEX_FIELD] THEN
2141 [ASM_MESON_TAC[HOLOMORPHIC_ON_SUBSET; SUBSET_UNIV]; ALL_TAC] THEN
2142 ASM_REWRITE_TAC[UNION_SUBSET] THEN CONJ_TAC THEN MATCH_MP_TAC(SET_RULE
2143 `~(x IN s) /\ s SUBSET t ==> s SUBSET (t DELETE x)`) THEN
2144 ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP
2145 (REWRITE_RULE[IMP_CONJ] SUBSET_TRANS)) THEN
2146 SIMP_TAC[SUBSET; IN_ELIM_THM; IN_CBALL; dist; COMPLEX_SUB_LZERO;
2150 DISCH_THEN(fun th -> ASSUME_TAC th THEN MP_TAC th) THEN
2151 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_INTEGRABLE) THEN
2152 ASM_SIMP_TAC[PATH_INTEGRABLE_JOIN; IMP_CONJ] THEN
2153 REWRITE_TAC[path_integrable_on] THEN
2154 DISCH_THEN(X_CHOOSE_THEN `integral_sA:complex` (LABEL_TAC "sA")) THEN
2155 DISCH_THEN(X_CHOOSE_THEN `integral_sA':complex` (LABEL_TAC "sA'")) THEN
2157 `integral_sA + integral_sA' = Cx(&2) * Cx pi * ii * S_N(w:complex)`
2159 [MATCH_MP_TAC HAS_PATH_INTEGRAL_UNIQUE THEN MAP_EVERY EXISTS_TAC
2160 [`\z. S_N(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx R pow 2)`;
2161 `A ++ A':real^1->complex`] THEN
2162 ASM_SIMP_TAC[HAS_PATH_INTEGRAL_JOIN];
2165 `((\z. S_N(w - z) * Cx (&N) cpow (--z) * (Cx (&1) / z + z / Cx R pow 2))
2166 has_path_integral integral_sA') A`
2167 (LABEL_TAC "s'A") THENL
2168 [SUBGOAL_THEN `(A:real^1->complex) = (--) o (--) o A` SUBST1_TAC THENL
2169 [REWRITE_TAC[FUN_EQ_THM; o_DEF; COMPLEX_NEG_NEG]; ALL_TAC] THEN
2170 MATCH_MP_TAC HAS_PATH_INTEGRAL_NEGATEPATH THEN ASM_REWRITE_TAC[] THEN
2171 GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV o ABS_CONV)
2172 [GSYM COMPLEX_NEG_NEG] THEN
2173 MATCH_MP_TAC HAS_PATH_INTEGRAL_NEG THEN
2174 REMOVE_THEN "sA'" MP_TAC THEN MATCH_MP_TAC EQ_IMP THEN
2175 AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
2176 REWRITE_TAC[FUN_EQ_THM; COMPLEX_SUB_RNEG; COMPLEX_NEG_NEG] THEN
2177 REWRITE_TAC[complex_div; COMPLEX_INV_NEG; COMPLEX_MUL_LID] THEN
2178 REWRITE_TAC[GSYM COMPLEX_NEG_ADD; COMPLEX_MUL_LNEG; COMPLEX_MUL_RNEG] THEN
2179 REWRITE_TAC[COMPLEX_NEG_NEG];
2182 `(\z. r_N(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx(R) pow 2))
2183 path_integrable_on A`
2185 [REWRITE_TAC[GSYM(ASSUME `!w. (f:complex->complex) w - S_N w = r_N w`)] THEN
2186 REWRITE_TAC[COMPLEX_SUB_RDISTRIB] THEN
2187 MATCH_MP_TAC PATH_INTEGRABLE_SUB THEN
2188 REWRITE_TAC[path_integrable_on] THEN ASM_MESON_TAC[];
2190 REWRITE_TAC[path_integrable_on; LEFT_IMP_EXISTS_THM] THEN
2191 X_GEN_TAC `integral_rA:complex` THEN DISCH_THEN(LABEL_TAC "rA") THEN
2192 SUBGOAL_THEN `integral_fA - integral_sA:complex = integral_rA`
2194 [MATCH_MP_TAC HAS_PATH_INTEGRAL_UNIQUE THEN MAP_EVERY EXISTS_TAC
2195 [`\z. r_N(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx R pow 2)`;
2196 `A:real^1->complex`] THEN
2197 ASM_REWRITE_TAC[] THEN
2198 REWRITE_TAC[GSYM(ASSUME `!w. (f:complex->complex) w - S_N w = r_N w`)] THEN
2199 REWRITE_TAC[COMPLEX_SUB_RDISTRIB] THEN
2200 MATCH_MP_TAC HAS_PATH_INTEGRAL_SUB THEN ASM_REWRITE_TAC[];
2203 `r_N(w:complex) = ((integral_rA - integral_sA') + integral_fB) /
2204 (Cx(&2) * Cx(pi) * ii)`
2206 [SIMP_TAC[COMPLEX_FIELD `~(z = Cx(&0)) ==> (x = y / z <=> z * x = y)`;
2208 REWRITE_TAC[GSYM(ASSUME `!w. (f:complex->complex) w - S_N w = r_N w`)] THEN
2209 REWRITE_TAC[COMPLEX_SUB_LDISTRIB; GSYM COMPLEX_MUL_ASSOC] THEN
2210 REPEAT(FIRST_X_ASSUM(MP_TAC o check (is_eq o concl))) THEN
2211 SIMPLE_COMPLEX_ARITH_TAC;
2213 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_MUL; COMPLEX_NORM_CX;
2214 COMPLEX_NORM_II; REAL_MUL_RID; REAL_ABS_PI; REAL_ABS_NUM] THEN
2215 SIMP_TAC[REAL_LT_LDIV_EQ; PI_POS; REAL_ARITH `&0 < &2 * p <=> &0 < p`] THEN
2216 MATCH_MP_TAC REAL_LET_TRANS THEN
2217 EXISTS_TAC `&4 * pi / R + &2 * pi / &N +
2218 &6 * M * R / (d * exp(d * log(&N))) +
2219 &4 * M / (R * log(&N)) pow 2` THEN
2222 MATCH_MP_TAC(REAL_ARITH
2223 `&4 * pi / R <= &4 * pi * (e / &3) /\
2224 y < &2 / &3 * e * pi
2225 ==> &4 * pi / R + y < e * &2 * pi`) THEN
2226 ASM_SIMP_TAC[REAL_ARITH `abs x < e ==> x < e`] THEN
2227 SIMP_TAC[real_div; REAL_LE_LMUL_EQ; REAL_OF_NUM_LT; ARITH; PI_POS] THEN
2228 REWRITE_TAC[GSYM real_div] THEN
2229 ONCE_REWRITE_TAC[GSYM REAL_INV_DIV] THEN
2230 MATCH_MP_TAC REAL_LE_INV2 THEN
2231 ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
2232 EXPAND_TAC "R" THEN REAL_ARITH_TAC] THEN
2233 MATCH_MP_TAC(NORM_ARITH
2234 `norm(x) <= &2 * a /\ norm(y) <= &2 * a + b /\ norm(z) <= c
2235 ==> norm(x - y + z) <= &4 * a + b + c`) THEN
2236 REPEAT CONJ_TAC THENL
2238 [`\z. r_N(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx R pow 2)`;
2239 `integral_rA:complex`; `Cx(&0)`; `R:real`; `--(pi / &2)`; `pi / &2`;
2241 `{complex(&0,R),complex(&0,--R)}`]
2242 HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG) THEN
2243 ASM_REWRITE_TAC[FINITE_INSERT; FINITE_RULES] THEN
2244 ASM_SIMP_TAC[REAL_POW_LT; REAL_LE_DIV; REAL_POS; REAL_LT_IMP_LE] THEN
2245 REWRITE_TAC[REAL_ARITH `p / &2 - --(p / &2) = p`; PI_POS_LE;
2246 REAL_ARITH `--(p / &2) <= (p / &2) <=> &0 <= p`] THEN
2247 ASM_SIMP_TAC[REAL_FIELD `~(r = &0) ==> &2 / r pow 2 * r * x = &2 * x / r`;
2248 REAL_LT_IMP_NZ] THEN
2249 DISCH_THEN MATCH_MP_TAC THEN X_GEN_TAC `z:complex` THEN
2250 REWRITE_TAC[IN_DIFF; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM] THEN
2252 SUBGOAL_THEN `norm(z) = R /\ &0 < Re z` STRIP_ASSUME_TAC THENL
2253 [UNDISCH_TAC `path_image A SUBSET {z | Re z >= &0 /\ norm z = R}` THEN
2254 REWRITE_TAC[SUBSET; IN_ELIM_THM; real_ge] THEN
2255 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_SIMP_TAC[REAL_LT_LE] THEN
2256 REWRITE_TAC[NORM_EQ_SQUARE; DOT_SQUARE_NORM; COMPLEX_SQNORM] THEN
2257 ASM_CASES_TAC `Re z = &0` THEN ASM_REWRITE_TAC[] THEN
2258 DISCH_THEN(MP_TAC o last o CONJUNCTS) THEN
2259 REWRITE_TAC[REAL_RING
2260 `&0 pow 2 + x pow 2 = y pow 2 <=> x = y \/ x = --y`] THEN
2261 REWRITE_TAC[DE_MORGAN_THM] THEN STRIP_TAC THEN
2262 UNDISCH_TAC `~(z = complex(&0,--R))` THEN
2263 UNDISCH_TAC `~(z = complex(&0,R))` THEN
2264 ASM_REWRITE_TAC[COMPLEX_EQ; RE; IM] THEN REAL_ARITH_TAC;
2266 MATCH_MP_TAC REAL_LE_TRANS THEN
2267 EXISTS_TAC `&1 / (Re z * exp(Re z * log(&N))) *
2268 exp(Re z * log(&N)) * (&2 * abs(Re z) / R pow 2)` THEN
2271 ASM_SIMP_TAC[REAL_ARITH `&0 < z ==> abs z = z`] THEN
2272 ASM_SIMP_TAC[REAL_EXP_NZ; REAL_LE_REFL; REAL_FIELD
2273 `&0 < z /\ ~(e = &0)
2274 ==> &1 / (z * e) * e * &2 * z / R pow 2 = &2 / R pow 2`]] THEN
2275 ONCE_REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
2276 REWRITE_TAC[NORM_POS_LE] THEN CONJ_TAC THENL
2278 REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
2279 ASM_SIMP_TAC[NORM_POS_LE; REAL_LE_REFL; NORM_CPOW_REAL; BOUND_LEMMA_1;
2280 REAL_CX; RE_CX; REAL_OF_NUM_LT; LT_NZ]] THEN
2281 MATCH_MP_TAC(ISPEC `sequentially` LIM_NORM_UBOUND) THEN
2283 `\n. vsum(1..n) (\n. a n / Cx (&n) cpow (w + z)) - S_N(w + z)` THEN
2284 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY; TRIVIAL_LIMIT_SEQUENTIALLY] THEN
2286 [REWRITE_TAC[GSYM(ASSUME
2287 `!w. (f:complex->complex) w - S_N w = r_N w`)] THEN
2288 MATCH_MP_TAC LIM_SUB THEN REWRITE_TAC[LIM_CONST] THEN
2289 MP_TAC(SPEC `w + z:complex` (ASSUME
2290 `!z. Re z > &1 ==> ((\n. a n / Cx(&n) cpow z) sums f z) (from 1)`)) THEN
2291 SIMP_TAC[RE_ADD; REAL_ARITH `&0 < z ==> &1 + z > &1`;
2292 ASSUME `Re w = &1`; ASSUME `&0 < Re z`] THEN
2293 REWRITE_TAC[sums; FROM_INTER_NUMSEG];
2295 EXISTS_TAC `N + 1` THEN X_GEN_TAC `n:num` THEN STRIP_TAC THEN
2296 REWRITE_TAC[GSYM(ASSUME
2297 `!w. vsum (1..N) (\n. a n / Cx (&n) cpow w) = S_N w`)] THEN
2298 MATCH_MP_TAC REAL_LE_TRANS THEN
2299 EXISTS_TAC `norm(vsum(N+1..n) (\n. a n / Cx(&n) cpow (w + z)))` THEN
2302 MATCH_MP_TAC BOUND_LEMMA_4 THEN ASM_SIMP_TAC[REAL_LE_REFL] THEN
2303 ASM_REWRITE_TAC[ARITH_RULE `1 <= N <=> ~(N = 0)`]] THEN
2304 MATCH_MP_TAC(NORM_ARITH `y + z = x ==> norm(x - y) <= norm(z)`) THEN
2305 MP_TAC(SPECL [`1`; `N:num`; `n:num`] NUMSEG_COMBINE_R) THEN
2307 [MAP_EVERY UNDISCH_TAC [`~(N = 0)`; `N + 1 <= n`] THEN ARITH_TAC;
2309 DISCH_THEN(SUBST1_TAC o SYM) THEN CONV_TAC SYM_CONV THEN
2310 MATCH_MP_TAC VSUM_UNION THEN
2311 REWRITE_TAC[FINITE_NUMSEG; DISJOINT_NUMSEG] THEN ARITH_TAC;
2314 [`\z. S_N(w - z) * Cx(&N) cpow (--z) * (Cx(&1) / z + z / Cx R pow 2)`;
2315 `integral_sA':complex`; `Cx(&0)`; `R:real`; `--(pi / &2)`; `pi / &2`;
2316 `&2 / R pow 2 + &2 / (&N * R)`;
2317 `{complex(&0,R),complex(&0,--R)}`]
2318 HAS_PATH_INTEGRAL_BOUND_PARTCIRCLEPATH_STRONG) THEN
2319 ASM_SIMP_TAC[REAL_OF_NUM_EQ; REAL_FIELD
2320 `&0 < R /\ ~(N = &0)
2321 ==> (&2 / R pow 2 + &2 / (N * R)) * R * (p / &2 - --(p / &2)) =
2322 &2 * p / R + &2 * p / N`] THEN
2323 DISCH_THEN MATCH_MP_TAC THEN
2324 REWRITE_TAC[FINITE_INSERT; FINITE_RULES] THEN CONJ_TAC THENL
2325 [MATCH_MP_TAC REAL_LE_ADD THEN
2326 ASM_SIMP_TAC[REAL_POW_LE; REAL_LE_DIV; REAL_LE_MUL; REAL_POS;
2329 ASM_SIMP_TAC[PI_POS; REAL_ARITH `&0 < x ==> --(x / &2) <= x / &2`] THEN
2330 X_GEN_TAC `z:complex` THEN
2331 REWRITE_TAC[IN_DIFF; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM] THEN
2333 SUBGOAL_THEN `norm(z) = R /\ &0 < Re z` STRIP_ASSUME_TAC THENL
2334 [UNDISCH_TAC `path_image A SUBSET {z | Re z >= &0 /\ norm z = R}` THEN
2335 REWRITE_TAC[SUBSET; IN_ELIM_THM; real_ge] THEN
2336 DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN ASM_SIMP_TAC[REAL_LT_LE] THEN
2337 REWRITE_TAC[NORM_EQ_SQUARE; DOT_SQUARE_NORM; COMPLEX_SQNORM] THEN
2338 ASM_CASES_TAC `Re z = &0` THEN ASM_REWRITE_TAC[] THEN
2339 DISCH_THEN(MP_TAC o last o CONJUNCTS) THEN
2340 REWRITE_TAC[REAL_RING
2341 `&0 pow 2 + x pow 2 = y pow 2 <=> x = y \/ x = --y`] THEN
2342 REWRITE_TAC[DE_MORGAN_THM] THEN STRIP_TAC THEN
2343 UNDISCH_TAC `~(z = complex(&0,--R))` THEN
2344 UNDISCH_TAC `~(z = complex(&0,R))` THEN
2345 ASM_REWRITE_TAC[COMPLEX_EQ; RE; IM] THEN REAL_ARITH_TAC;
2347 MATCH_MP_TAC REAL_LE_TRANS THEN
2348 EXISTS_TAC `(exp (Re z * log (&N)) * (&1 / &N + &1 / Re z)) *
2349 inv(exp(Re z * log(&N))) * (&2 * abs(Re z) / R pow 2)` THEN
2352 ASM_SIMP_TAC[REAL_ARITH `&0 < z ==> abs z = z`] THEN
2353 ASM_SIMP_TAC[REAL_EXP_NZ; REAL_FIELD
2354 `~(e = &0) ==> (e * x) * inv(e) * y = x * y`] THEN
2355 ASM_SIMP_TAC[REAL_FIELD
2356 `&0 < x ==> (n + &1 / x) * &2 * x / y = &2 / y + &2 * x * n / y`] THEN
2357 REWRITE_TAC[REAL_LE_LADD] THEN
2358 ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LT_MUL; REAL_OF_NUM_LT; LT_NZ;
2359 REAL_FIELD `&0 < n /\ &0 < r
2360 ==> (&2 * z * &1 / n / r pow 2) * n * r = &2 * z / r`] THEN
2361 MATCH_MP_TAC(REAL_ARITH `x <= &1 ==> &2 * x <= &2`) THEN
2362 ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
2363 MP_TAC(SPEC `z:complex` COMPLEX_NORM_GE_RE_IM) THEN
2364 ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC] THEN
2365 ONCE_REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
2366 REWRITE_TAC[NORM_POS_LE] THEN CONJ_TAC THENL
2367 [REWRITE_TAC[GSYM(ASSUME
2368 `!w. vsum (1..N) (\n. a n / Cx (&n) cpow w) = S_N w`)] THEN
2369 MATCH_MP_TAC BOUND_LEMMA_3 THEN
2370 ASM_REWRITE_TAC[REAL_LE_REFL; ARITH_RULE `1 <= N <=> ~(N = 0)`];
2372 REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
2373 ASM_SIMP_TAC[NORM_POS_LE; REAL_LE_REFL; NORM_CPOW_REAL; BOUND_LEMMA_1;
2374 REAL_CX; RE_CX; REAL_OF_NUM_LT; LT_NZ] THEN
2375 REWRITE_TAC[RE_NEG; REAL_MUL_LNEG; REAL_EXP_NEG; REAL_LE_REFL];
2379 `(\z. f(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx R pow 2))
2380 path_integrable_on B`
2382 [ASM_MESON_TAC[path_integrable_on]; ALL_TAC] THEN
2384 SIMP_TAC[PATH_INTEGRABLE_JOIN; VALID_PATH_JOIN; PATHSTART_JOIN;
2385 PATHFINISH_JOIN; VALID_PATH_LINEPATH; PATHSTART_LINEPATH;
2386 PATHFINISH_LINEPATH] THEN
2387 REWRITE_TAC[path_integrable_on; IMP_CONJ; LEFT_IMP_EXISTS_THM] THEN
2388 X_GEN_TAC `integral_fC:complex` THEN DISCH_TAC THEN
2389 X_GEN_TAC `integral_fD:complex` THEN DISCH_TAC THEN
2390 X_GEN_TAC `integral_fC':complex` THEN DISCH_TAC THEN
2392 `integral_fB:complex = integral_fC + integral_fD + integral_fC'`
2394 [MATCH_MP_TAC HAS_PATH_INTEGRAL_UNIQUE THEN
2395 MAP_EVERY EXISTS_TAC
2396 [`\z. f(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx R pow 2)`;
2397 `B:real^1->complex`] THEN
2398 ASM_SIMP_TAC[] THEN EXPAND_TAC "B" THEN
2399 REPEAT(MATCH_MP_TAC HAS_PATH_INTEGRAL_JOIN THEN
2400 ASM_SIMP_TAC[VALID_PATH_JOIN; PATHSTART_JOIN; PATHFINISH_LINEPATH;
2401 PATHFINISH_JOIN; VALID_PATH_LINEPATH; PATHSTART_LINEPATH]);
2403 MATCH_MP_TAC(NORM_ARITH
2404 `norm(y) <= a /\ norm(x) <= &2 * b /\ norm(z) <= &2 * b
2405 ==> norm(x + y + z) <= a + &4 * b`) THEN
2408 [`\z. f(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx R pow 2)`;
2409 `integral_fD:complex`;
2410 `complex (--d,R)`; `complex (--d,--R)`;
2411 `M * inv(exp(d * log(&N))) * &3 / d`]
2412 HAS_PATH_INTEGRAL_BOUND_LINEPATH) THEN
2413 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
2415 SUBGOAL_THEN `complex (--d,--R) - complex (--d,R) =
2416 Cx(&2) * ii * Cx(--R)`
2418 [REWRITE_TAC[COMPLEX_EQ; RE_SUB; IM_SUB; RE_MUL_CX; IM_MUL_CX;
2419 RE_CX; IM_CX; RE_MUL_II; IM_MUL_II; RE; IM] THEN
2422 MATCH_MP_TAC(REAL_ARITH `a = b ==> x <= a ==> x <= b`) THEN
2423 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX; COMPLEX_NORM_II] THEN
2424 ASM_SIMP_TAC[REAL_ARITH `&0 < R ==> abs(--R) = R`; REAL_ABS_NUM] THEN
2425 CONV_TAC REAL_FIELD] THEN
2427 [REPEAT(MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC) THEN
2428 ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LE_INV_EQ; REAL_EXP_POS_LE;
2429 REAL_LE_DIV; REAL_POS];
2431 X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
2432 SUBGOAL_THEN `Re z = --d` ASSUME_TAC THENL
2433 [UNDISCH_TAC `z IN segment[complex(--d,R),complex(--d,--R)]` THEN
2434 REWRITE_TAC[segment; IN_ELIM_THM] THEN
2435 STRIP_TAC THEN ASM_REWRITE_TAC[RE_CMUL; RE_ADD; RE] THEN
2438 SUBGOAL_THEN `segment[complex(--d,R),complex(--d,--R)] SUBSET
2439 {z | abs(Im z) <= R}`
2441 [REWRITE_TAC[SEGMENT_CONVEX_HULL] THEN MATCH_MP_TAC HULL_MINIMAL THEN
2442 REWRITE_TAC[REAL_ARITH `abs(x) <= r <=> x >= --r /\ x <= r`] THEN
2443 SIMP_TAC[SET_RULE `{x | P x /\ Q x} = {x | P x} INTER {x | Q x}`;
2444 CONVEX_INTER; CONVEX_HALFSPACE_IM_LE; CONVEX_HALFSPACE_IM_GE] THEN
2445 REWRITE_TAC[SET_RULE `{a,b} SUBSET s <=> a IN s /\ b IN s`] THEN
2446 REWRITE_TAC[IN_ELIM_THM; IN_INTER; IM] THEN
2447 UNDISCH_TAC `&0 < R` THEN REAL_ARITH_TAC;
2449 REWRITE_TAC[SUBSET] THEN DISCH_THEN(MP_TAC o SPEC `z:complex`) THEN
2450 ASM_REWRITE_TAC[IN_ELIM_THM] THEN DISCH_TAC THEN
2451 ONCE_REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
2452 REWRITE_TAC[NORM_POS_LE] THEN CONJ_TAC THENL
2453 [FIRST_X_ASSUM MATCH_MP_TAC THEN
2454 ASM_REWRITE_TAC[real_ge; REAL_LE_REFL] THEN
2455 MAP_EVERY UNDISCH_TAC [`&0 < R`; `&0 < d`] THEN REAL_ARITH_TAC;
2457 ONCE_REWRITE_TAC[COMPLEX_NORM_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
2458 REWRITE_TAC[NORM_POS_LE] THEN CONJ_TAC THENL
2459 [ASM_SIMP_TAC[CPOW_REAL_REAL; NORM_CPOW_REAL; REAL_CX; RE_CX;
2460 REAL_OF_NUM_LT; LT_NZ] THEN
2461 REWRITE_TAC[REAL_MUL_LNEG; REAL_EXP_NEG; REAL_LE_REFL];
2463 SUBGOAL_THEN `~(z = Cx(&0))` ASSUME_TAC THENL
2464 [DISCH_TAC THEN UNDISCH_TAC `Re z = --d` THEN
2465 ASM_REWRITE_TAC[RE_CX] THEN UNDISCH_TAC `&0 < d` THEN REAL_ARITH_TAC;
2467 ASM_SIMP_TAC[CX_INJ; REAL_LT_IMP_NZ; COMPLEX_FIELD
2468 `~(z = Cx(&0)) /\ ~(R = Cx(&0))
2469 ==> Cx(&1) / z + z / R pow 2 =
2470 (Cx(&1) + (z / R) pow 2) * inv(z)`] THEN
2471 ONCE_REWRITE_TAC[COMPLEX_NORM_MUL] THEN REWRITE_TAC[real_div] THEN
2472 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THEN
2474 [MATCH_MP_TAC(NORM_ARITH
2475 `norm(i) = &1 /\ norm(z) <= &2 ==> norm(i + z) <= &3`) THEN
2476 REWRITE_TAC[COMPLEX_NORM_CX; COMPLEX_NORM_POW; REAL_ABS_NUM] THEN
2477 REWRITE_TAC[COMPLEX_NORM_DIV; REAL_POW_DIV] THEN
2478 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; COMPLEX_NORM_NZ; REAL_POW_LT;
2479 CX_INJ; REAL_LT_IMP_NZ] THEN
2480 REWRITE_TAC[COMPLEX_NORM_CX; REAL_POW2_ABS] THEN
2481 ASM_REWRITE_TAC[COMPLEX_SQNORM] THEN
2482 MATCH_MP_TAC(REAL_ARITH
2483 `d pow 2 <= R pow 2 /\ i pow 2 <= R pow 2
2484 ==> --d pow 2 + i pow 2 <= &2 * R pow 2`) THEN
2485 ONCE_REWRITE_TAC[GSYM REAL_LE_SQUARE_ABS] THEN
2486 MAP_EVERY UNDISCH_TAC
2487 [`&0 < d`; `&0 < R`; `d <= R`; `abs(Im z) <= R`] THEN
2490 REWRITE_TAC[COMPLEX_NORM_INV] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
2491 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
2492 EXISTS_TAC `abs(Re z)` THEN REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN
2493 ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC;
2496 [`\z. --(inv(clog(Cx(&N)) pow 2)) * (Cx(&1) + z * clog(Cx(&N))) *
2498 `\z. z * Cx(&N) cpow (--z)`;
2499 `linepath(Cx(&0),Cx(d))`;
2500 `(:complex)`] PATH_INTEGRAL_PRIMITIVE) THEN
2501 REWRITE_TAC[VALID_PATH_LINEPATH; SUBSET_UNIV; IN_UNIV] THEN ANTS_TAC THENL
2502 [X_GEN_TAC `z:complex` THEN COMPLEX_DIFF_TAC THEN
2503 REWRITE_TAC[COMPLEX_MUL_LID; COMPLEX_ADD_LID; COMPLEX_MUL_LNEG] THEN
2504 ASM_REWRITE_TAC[CX_INJ; REAL_OF_NUM_EQ] THEN
2505 SUBGOAL_THEN `~(clog(Cx(&N)) = Cx(&0))` MP_TAC THENL
2506 [ALL_TAC; CONV_TAC COMPLEX_FIELD] THEN
2507 ASM_SIMP_TAC[GSYM CX_LOG; REAL_OF_NUM_LT; LT_NZ; CX_INJ] THEN
2508 MATCH_MP_TAC REAL_LT_IMP_NZ THEN MATCH_MP_TAC LOG_POS_LT THEN
2509 ASM_REWRITE_TAC[REAL_OF_NUM_LT];
2511 REWRITE_TAC[PATHSTART_LINEPATH; PATHFINISH_LINEPATH] THEN
2512 REWRITE_TAC[COMPLEX_NEG_0; COMPLEX_MUL_LID; COMPLEX_MUL_LZERO;
2513 COMPLEX_ADD_RID] THEN
2514 REWRITE_TAC[COMPLEX_RING
2515 `--x * y - --x * z:complex = x * (z - y)`] THEN
2516 ASM_REWRITE_TAC[CPOW_N; CX_INJ; REAL_OF_NUM_EQ; complex_pow] THEN
2517 ASM_SIMP_TAC[CPOW_NEG; CPOW_REAL_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT;
2518 LT_NZ; GSYM CX_LOG; GSYM CX_MUL; GSYM CX_INV;
2519 GSYM CX_ADD; GSYM CX_SUB; GSYM CX_POW] THEN
2520 REWRITE_TAC[REAL_ARITH `&1 - (&1 + d) = --d`] THEN
2523 inv(log(&N) pow 2) *
2524 (&1 - (&1 + d * log(&N)) * inv(exp(d * log (&N))))` THEN
2526 `&0 <= integral_bound /\ integral_bound <= inv(log(&N) pow 2)`
2527 STRIP_ASSUME_TAC THENL
2528 [EXPAND_TAC "integral_bound" THEN
2529 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2530 GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [GSYM REAL_MUL_LID] THEN
2531 ASM_SIMP_TAC[GSYM real_div; REAL_LE_DIV2_EQ; REAL_LE_RDIV_EQ;
2532 REAL_POW_LT; LOG_POS_LT; REAL_OF_NUM_LT] THEN
2533 REWRITE_TAC[REAL_ARITH `&0 * x <= &1 - y /\ &1 - y <= &1 <=>
2534 &0 <= y /\ y <= &1`] THEN
2535 SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LE_LDIV_EQ; REAL_EXP_POS_LT] THEN
2536 REWRITE_TAC[REAL_MUL_LID; REAL_MUL_LZERO] THEN
2538 [MATCH_MP_TAC REAL_LE_ADD THEN REWRITE_TAC[REAL_POS];
2539 REWRITE_TAC[REAL_EXP_LE_X]] THEN
2540 ASM_SIMP_TAC[REAL_LE_MUL; REAL_LT_IMP_LE; LOG_POS_LT; REAL_OF_NUM_LT];
2542 DISCH_THEN(MP_TAC o MATCH_MP HAS_PATH_INTEGRAL_COMPLEX_LMUL) THEN
2543 DISCH_THEN(MP_TAC o SPEC `Cx(&2) * Cx(M) / Cx(R) pow 2`) THEN
2544 DISCH_THEN(fun th -> CONJ_TAC THEN MP_TAC th) THENL
2546 `((\z. f(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx R pow 2))
2547 has_path_integral integral_fC)
2548 (linepath (complex (&0,R),complex (--d,R)))`;
2550 `((\z. f(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx R pow 2))
2551 has_path_integral integral_fC')
2552 (linepath (complex(--d,--R),complex(&0,--R)))`] THEN
2553 REWRITE_TAC[HAS_PATH_INTEGRAL; VECTOR_DERIVATIVE_LINEPATH_AT] THENL
2555 DISCH_THEN(MP_TAC o C CONJ (ARITH_RULE `~(-- &1 = &0)`)) THEN
2556 DISCH_THEN(MP_TAC o SPEC `vec 1:real^1` o
2557 MATCH_MP HAS_INTEGRAL_AFFINITY) THEN
2558 REWRITE_TAC[IMAGE_AFFINITY_INTERVAL] THEN
2559 REWRITE_TAC[INTERVAL_EQ_EMPTY_1; DROP_VEC] THEN
2560 CONV_TAC REAL_RAT_REDUCE_CONV THEN
2561 REWRITE_TAC[VECTOR_MUL_LID; VECTOR_MUL_LNEG; VECTOR_NEG_0;
2562 VECTOR_ADD_LID; VECTOR_NEG_NEG; REAL_POW_ONE; REAL_INV_1] THEN
2563 REWRITE_TAC[VECTOR_ARITH `--x + y:real^1 = y - x`; VECTOR_SUB_REFL]] THEN
2565 `(!x. linepath(complex (&0,R),complex (--d,R)) x =
2566 ii * Cx(R) - Cx(d * drop x)) /\
2567 (!x. linepath(Cx (&0),Cx d) x = Cx(d * drop x)) /\
2568 (complex(--d,R) - complex(&0,R) = --Cx(d)) /\
2569 (!x. linepath(complex (--d,--R),complex(&0,--R)) (vec 1 - x) =
2570 --ii * Cx(R) - Cx(d * drop x)) /\
2571 (complex(&0,--R) - complex(--d,--R) = Cx(d))`
2572 (fun th -> REWRITE_TAC[th])
2574 [REWRITE_TAC[linepath; COMPLEX_EQ; IM_CMUL; RE_CMUL; IM; RE; RE_SUB;
2575 IM_SUB; IM_ADD; RE_ADD; RE_MUL_II; IM_MUL_II; RE_MUL_CX;
2576 RE_II; IM_II; IM_MUL_CX; IM_CX; RE_CX; RE_NEG; IM_NEG;
2577 DROP_SUB; DROP_VEC] THEN
2580 REWRITE_TAC[IMP_IMP] THEN DISCH_THEN(MP_TAC o MATCH_MP
2581 (ONCE_REWRITE_RULE[TAUT `a /\ b /\ c /\ d /\ e ==> f <=>
2582 c /\ d ==> a /\ b /\ e ==> f`]
2583 HAS_INTEGRAL_NORM_BOUND_INTEGRAL_COMPONENT)) THEN
2584 DISCH_THEN(MP_TAC o SPEC `1`) THEN REWRITE_TAC[GSYM RE_DEF] THEN
2587 MATCH_MP_TAC(REAL_ARITH `a <= b ==> x <= a ==> x <= b`) THEN
2588 REWRITE_TAC[GSYM CX_POW; GSYM CX_MUL; GSYM CX_DIV; RE_CX] THEN
2589 REWRITE_TAC[real_div; GSYM REAL_POW_INV; REAL_POW_MUL; REAL_INV_MUL] THEN
2590 MATCH_MP_TAC(REAL_ARITH
2591 `&0 <= (M * R) * (b - i) ==> (&2 * M * R) * i <= &2 * M * R * b`) THEN
2592 MATCH_MP_TAC REAL_LE_MUL THEN
2593 ASM_SIMP_TAC[REAL_SUB_LE; REAL_LE_MUL; REAL_POW_LE; REAL_LE_INV_EQ;
2594 REAL_LT_IMP_LE] THEN
2595 ASM_REWRITE_TAC[REAL_POW_INV]] THEN
2596 REWRITE_TAC[DIMINDEX_2; ARITH] THEN
2597 REWRITE_TAC[IN_INTERVAL_1; GSYM FORALL_DROP; DROP_VEC] THEN
2598 X_GEN_TAC `x:real` THEN STRIP_TAC THEN
2599 REWRITE_TAC[COMPLEX_NORM_MUL] THEN
2600 ASM_SIMP_TAC[NORM_CPOW_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT;
2601 CPOW_REAL_REAL; LT_NZ] THEN
2602 REWRITE_TAC[RE_MUL_II; RE_NEG; RE_II; RE_MUL_CX; RE_SUB; RE_CX; IM_CX] THEN
2603 REWRITE_TAC[REAL_MUL_LZERO; REAL_NEG_0; COMPLEX_SUB_RZERO;
2604 REAL_ARITH `&0 - d * x = --(d * x)`] THEN
2605 GEN_REWRITE_TAC (RAND_CONV o TOP_DEPTH_CONV)
2606 [GSYM CX_MUL; GSYM CX_INV; GSYM CX_POW; GSYM CX_DIV; RE_CX] THEN
2607 REWRITE_TAC[NORM_NEG; COMPLEX_NORM_CX] THEN
2608 ASM_SIMP_TAC[REAL_ARITH `&0 < d ==> abs d = d`; REAL_LE_RMUL_EQ;
2609 REAL_MUL_ASSOC] THEN
2610 GEN_REWRITE_TAC LAND_CONV
2611 [REAL_ARITH `(a * b) * c:real = (a * c) * b`] THEN
2612 REWRITE_TAC[GSYM REAL_EXP_NEG; REAL_MUL_LNEG] THEN
2613 ASM_SIMP_TAC[REAL_LE_RMUL_EQ; REAL_EXP_POS_LT] THEN
2614 REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
2615 ONCE_REWRITE_TAC[REAL_ARITH
2616 `&2 * M * r * d * x = M * (&2 * (d * x) * r)`] THEN
2617 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE; GSYM real_div] THEN
2619 [FIRST_X_ASSUM MATCH_MP_TAC THEN
2620 REWRITE_TAC[RE_MUL_II; IM_MUL_II; RE_SUB; IM_SUB; RE_CX; IM_CX;
2621 COMPLEX_MUL_LNEG; RE_NEG; IM_NEG] THEN
2622 SUBGOAL_THEN `&0 <= d * x /\ d * x <= d * &1` MP_TAC THENL
2624 MAP_EVERY UNDISCH_TAC [`&0 < d`; `d <= R`] THEN REAL_ARITH_TAC] THEN
2625 ASM_SIMP_TAC[REAL_LE_MUL; REAL_LT_IMP_LE; REAL_LE_LMUL_EQ];
2627 MATCH_MP_TAC BOUND_LEMMA_2 THEN
2628 ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LE_MUL] THEN
2629 REWRITE_TAC[RE_MUL_II; IM_MUL_II; RE_SUB; IM_SUB; RE_CX; IM_CX;
2630 COMPLEX_MUL_LNEG; RE_NEG; IM_NEG] THEN
2631 UNDISCH_TAC `&0 < R` THEN REAL_ARITH_TAC));;
2633 (* ------------------------------------------------------------------------- *)
2634 (* The application is to any bounded a_n, not |a_n| <= 1, so... *)
2635 (* ------------------------------------------------------------------------- *)
2637 let NEWMAN_INGHAM_THEOREM_BOUND = prove
2639 (!n. 1 <= n ==> norm(a(n)) <= b) /\
2640 f analytic_on {z | Re(z) >= &1} /\
2641 (!z. Re(z) > &1 ==> ((\n. a(n) / Cx(&n) cpow z) sums (f z)) (from 1))
2643 ==> ((\n. a(n) / Cx(&n) cpow z) sums (f z)) (from 1)`,
2644 REPEAT GEN_TAC THEN STRIP_TAC THEN
2645 MP_TAC(ISPECL [`\z:complex. inv(Cx(b)) * f z`;
2646 `\n:num. inv(Cx(b)) * a n`]
2647 NEWMAN_INGHAM_THEOREM) THEN
2648 ASM_SIMP_TAC[ANALYTIC_ON_MUL; ANALYTIC_ON_CONST] THEN
2649 REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_ASSOC] THEN
2650 REWRITE_TAC[GSYM complex_div] THEN ASM_SIMP_TAC[SERIES_COMPLEX_LMUL] THEN
2651 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_INV] THEN
2652 REWRITE_TAC[GSYM(ONCE_REWRITE_RULE[REAL_MUL_SYM] real_div)] THEN
2653 ASM_SIMP_TAC[COMPLEX_NORM_CX; REAL_ARITH `&0 < b ==> abs b = b`;
2654 REAL_LE_LDIV_EQ; REAL_MUL_LID] THEN
2655 MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `z:complex` THEN
2656 DISCH_THEN(fun th -> DISCH_TAC THEN MP_TAC th) THEN ASM_REWRITE_TAC[] THEN
2657 DISCH_THEN(MP_TAC o SPEC `Cx b` o MATCH_MP SERIES_COMPLEX_LMUL) THEN
2658 ASM_SIMP_TAC[complex_div; COMPLEX_MUL_ASSOC; COMPLEX_MUL_RINV;
2659 CX_INJ; REAL_LT_IMP_NZ; COMPLEX_MUL_LID]);;
2661 let NEWMAN_INGHAM_THEOREM_STRONG = prove
2662 (`!f a b. (!n. 1 <= n ==> norm(a(n)) <= b) /\
2663 f analytic_on {z | Re(z) >= &1} /\
2664 (!z. Re(z) > &1 ==> ((\n. a(n) / Cx(&n) cpow z) sums (f z)) (from 1))
2666 ==> ((\n. a(n) / Cx(&n) cpow z) sums (f z)) (from 1)`,
2667 REPEAT GEN_TAC THEN STRIP_TAC THEN
2668 MATCH_MP_TAC NEWMAN_INGHAM_THEOREM_BOUND THEN
2669 EXISTS_TAC `abs b + &1` THEN ASM_REWRITE_TAC[] THEN
2670 CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN
2671 ASM_MESON_TAC[REAL_ARITH `x <= b ==> x <= abs b + &1`]);;
2673 (* ------------------------------------------------------------------------- *)
2674 (* Newman's analytic function "f", re-using our "nearzeta" stuff. *)
2675 (* ------------------------------------------------------------------------- *)
2677 let GENZETA_BOUND_LEMMA = prove
2678 (`!n s m. ~(n = 0) /\ &1 < Re s /\ n + 1 <= m
2679 ==> sum(n..m) (\x. norm(Cx(&1) / Cx(&x) cpow s))
2680 <= (&1 / &n + &1 / (Re s - &1)) * exp((&1 - Re s) * log(&n))`,
2681 REPEAT STRIP_TAC THEN
2682 SIMP_TAC[SUM_CLAUSES_LEFT; MATCH_MP (ARITH_RULE `n + 1 <= m ==> n <= m`)
2683 (ASSUME `n + 1 <= m`)] THEN
2684 MATCH_MP_TAC(REAL_ARITH `y <= a - x ==> x + y <= a`) THEN
2686 [`\z. Cx(&1) / z cpow (Cx(Re s))`;
2687 `\z. Cx(&1) / ((Cx(&1) - (Cx(Re s))) * z cpow (Cx(Re s) - Cx(&1)))`;
2688 `n + 1`; `m:num`] SUM_INTEGRAL_UBOUND_DECREASING) THEN
2689 ASM_REWRITE_TAC[GSYM REAL_OF_NUM_ADD; REAL_ARITH `(n + &1) - &1 = n`] THEN
2692 [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN COMPLEX_DIFF_TAC THEN
2693 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_SEGMENT_CX_GEN]) THEN
2696 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM REAL_OF_NUM_LE]) THEN
2697 REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN ASM_REAL_ARITH_TAC] THEN
2698 SUBGOAL_THEN `&0 < Re z` ASSUME_TAC THENL
2699 [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM LT_NZ]) THEN
2700 REWRITE_TAC[GSYM REAL_OF_NUM_LT] THEN ASM_REAL_ARITH_TAC;
2702 SUBGOAL_THEN `~(z = Cx(&0))` ASSUME_TAC THENL
2703 [ASM_MESON_TAC[RE_CX; REAL_LT_REFL]; ALL_TAC] THEN
2704 ASM_REWRITE_TAC[CPOW_N; CPOW_SUB; COMPLEX_POW_1] THEN
2705 REWRITE_TAC[COMPLEX_ENTIRE; complex_div] THEN
2706 MATCH_MP_TAC(TAUT `(a ==> b) /\ a ==> a /\ b`) THEN
2708 [UNDISCH_TAC `~(z = Cx(&0))` THEN CONV_TAC COMPLEX_FIELD;
2709 ASM_REWRITE_TAC[COMPLEX_INV_EQ_0; CPOW_EQ_0; COMPLEX_SUB_0] THEN
2710 REWRITE_TAC[CX_INJ] THEN ASM_REAL_ARITH_TAC];
2712 MAP_EVERY X_GEN_TAC [`x:real`; `y:real`] THEN STRIP_TAC THEN
2713 SUBGOAL_THEN `&0 < x /\ &0 < y` STRIP_ASSUME_TAC THENL
2714 [RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LT; GSYM LT_NZ]) THEN
2717 ASM_SIMP_TAC[CPOW_REAL_REAL; RE_CX; REAL_CX; GSYM CX_DIV] THEN
2718 SIMP_TAC[real_div; REAL_MUL_LID; GSYM REAL_EXP_NEG; REAL_EXP_MONO_LE] THEN
2719 MATCH_MP_TAC(REAL_ARITH
2720 `&0 <= s * (y - x) ==> --(s * y) <= --(s * x)`) THEN
2721 MATCH_MP_TAC REAL_LE_MUL THEN
2722 CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
2723 REWRITE_TAC[REAL_SUB_LE] THEN MATCH_MP_TAC LOG_MONO_LE_IMP THEN
2726 MATCH_MP_TAC(REAL_ARITH `x = y /\ a <= b ==> x <= a ==> y <= b`) THEN
2728 [MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `r:num` THEN STRIP_TAC THEN
2729 SUBGOAL_THEN `0 < r` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
2730 ASM_SIMP_TAC[CPOW_REAL_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT;
2731 COMPLEX_NORM_DIV; NORM_CPOW_REAL] THEN
2732 REWRITE_TAC[COMPLEX_NORM_CX; GSYM CX_DIV; RE_CX; REAL_ABS_NUM];
2734 REWRITE_TAC[RE_SUB] THEN
2735 MATCH_MP_TAC(REAL_ARITH `&0 <= --x /\ --y <= e ==> x - y <= e`) THEN
2736 FIRST_ASSUM(ASSUME_TAC o MATCH_MP (ARITH_RULE `n + 1 <= m ==> 0 < m`)) THEN
2737 ASM_SIMP_TAC[GSYM CX_SUB; CPOW_REAL_REAL; REAL_CX; RE_CX; COMPLEX_NORM_DIV;
2738 REAL_OF_NUM_LT; NORM_CPOW_REAL; LT_NZ] THEN
2739 REWRITE_TAC[GSYM CX_MUL; GSYM CX_DIV; RE_CX] THEN
2740 REWRITE_TAC[COMPLEX_NORM_DIV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
2741 REWRITE_TAC[real_div; REAL_MUL_LID; GSYM REAL_INV_NEG] THEN
2742 REWRITE_TAC[GSYM REAL_MUL_LNEG; REAL_NEG_SUB] THEN
2743 ASM_SIMP_TAC[REAL_LE_INV_EQ; REAL_LE_MUL; REAL_EXP_POS_LE; REAL_SUB_LE;
2744 REAL_LT_IMP_LE] THEN
2745 REWRITE_TAC[REAL_INV_MUL; GSYM REAL_EXP_NEG] THEN
2746 REWRITE_TAC[GSYM REAL_MUL_LNEG; REAL_NEG_SUB] THEN
2747 MATCH_MP_TAC(REAL_ARITH `x <= n * e ==> i * e <= (n + i) * e - x`) THEN
2748 REWRITE_TAC[REAL_SUB_RDISTRIB; REAL_EXP_SUB; REAL_MUL_LID] THEN
2749 ASM_SIMP_TAC[EXP_LOG; REAL_OF_NUM_LT; LT_NZ; REAL_EXP_POS_LT;
2750 REAL_FIELD `&0 < x /\ &0 < z ==> inv(x) * x / z = inv(z)`] THEN
2751 REWRITE_TAC[REAL_MUL_LNEG; REAL_EXP_NEG; REAL_LE_REFL]);;
2753 let GENZETA_BOUND = prove
2754 (`!n s. ~(n = 0) /\ &1 < Re s
2755 ==> norm(genzeta n s) <=
2756 (&1 / &n + &1 / (Re s - &1)) * exp((&1 - Re s) * log(&n))`,
2757 REPEAT STRIP_TAC THEN
2758 MATCH_MP_TAC(ISPEC `sequentially` LIM_NORM_UBOUND) THEN
2759 EXISTS_TAC `\m. vsum(n..m) (\r. Cx(&1) / Cx(&r) cpow s)` THEN
2760 FIRST_ASSUM(MP_TAC o SPEC `n:num` o MATCH_MP GENZETA_CONVERGES) THEN
2761 SIMP_TAC[sums; FROM_INTER_NUMSEG; TRIVIAL_LIMIT_SEQUENTIALLY] THEN
2762 DISCH_TAC THEN REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
2763 EXISTS_TAC `n + 1` THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN
2764 W(MP_TAC o PART_MATCH (lhand o rand) VSUM_NORM o lhand o snd) THEN
2765 REWRITE_TAC[FINITE_NUMSEG] THEN
2766 MATCH_MP_TAC(REAL_ARITH `a <= b ==> x <= a ==> x <= b`) THEN
2767 ASM_SIMP_TAC[GENZETA_BOUND_LEMMA]);;
2769 let NEARZETA_BOUND_SHARP = prove
2770 (`!n s. ~(n = 0) /\ &0 < Re s
2771 ==> norm(nearzeta n s) <=
2772 norm(s * (s - Cx(&1))) *
2773 (&1 / &n + &1 / Re s) / exp(Re s * log(&n))`,
2774 REPEAT STRIP_TAC THEN
2775 MATCH_MP_TAC(ISPEC `sequentially` LIM_NORM_UBOUND) THEN
2778 (\r. (s - Cx(&1)) / Cx(&r) cpow s -
2779 (Cx(&1) / Cx(&r) cpow (s - Cx(&1)) -
2780 Cx(&1) / Cx(&(r + 1)) cpow (s - Cx(&1))))` THEN
2781 FIRST_ASSUM(MP_TAC o SPEC `n:num` o MATCH_MP NEARZETA_CONVERGES) THEN
2782 SIMP_TAC[sums; FROM_INTER_NUMSEG; TRIVIAL_LIMIT_SEQUENTIALLY] THEN
2783 DISCH_TAC THEN REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
2784 EXISTS_TAC `n + 1` THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN
2785 W(MP_TAC o PART_MATCH (lhand o rand) VSUM_NORM o lhand o snd) THEN
2786 REWRITE_TAC[FINITE_NUMSEG] THEN
2787 MATCH_MP_TAC(REAL_ARITH `a <= b ==> x <= a ==> x <= b`) THEN
2788 MATCH_MP_TAC REAL_LE_TRANS THEN
2789 EXISTS_TAC `sum (n..m)
2790 (\r. norm(s * (s - Cx (&1)) / Cx(&r) cpow (s + Cx(&1))))` THEN
2792 [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN
2793 MATCH_MP_TAC NEARZETA_BOUND_LEMMA THEN CONJ_TAC THENL
2794 [ASM_ARITH_TAC; ASM_REAL_ARITH_TAC];
2796 ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `a / b = a * Cx(&1) / b`] THEN
2797 REWRITE_TAC[SUM_LMUL; COMPLEX_NORM_MUL; GSYM REAL_MUL_ASSOC] THEN
2798 REPEAT(MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE]) THEN
2799 W(MP_TAC o PART_MATCH (lhand o rand) GENZETA_BOUND_LEMMA o lhand o snd) THEN
2800 ASM_REWRITE_TAC[RE_ADD; REAL_LT_ADDL; RE_CX] THEN
2801 MATCH_MP_TAC(REAL_ARITH `a <= b ==> x <= a ==> x <= b`) THEN
2802 REWRITE_TAC[REAL_ARITH `(x + &1) - &1 = x`;
2803 REAL_ARITH `(&1 - (s + &1)) * x = --(s * x)`] THEN
2804 REWRITE_TAC[real_div; REAL_EXP_NEG; REAL_LE_REFL]);;
2806 let NEARZETA_BOUND = prove
2807 (`!n s. ~(n = 0) /\ &0 < Re s
2808 ==> norm(nearzeta n s)
2809 <= ((norm(s) + &1) pow 3 / Re s) / exp (Re s * log (&n))`,
2810 REPEAT GEN_TAC THEN DISCH_TAC THEN
2811 FIRST_ASSUM(MP_TAC o MATCH_MP NEARZETA_BOUND_SHARP) THEN
2812 MATCH_MP_TAC(REAL_ARITH `a <= b ==> x <= a ==> x <= b`) THEN
2813 REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN MATCH_MP_TAC REAL_LE_RMUL THEN
2814 REWRITE_TAC[REAL_LE_INV_EQ; REAL_EXP_POS_LE; REAL_MUL_LID] THEN
2815 REWRITE_TAC[REAL_RING `(x pow 3):real = x * x * x`] THEN
2816 REWRITE_TAC[COMPLEX_NORM_MUL; GSYM REAL_MUL_ASSOC] THEN
2817 MATCH_MP_TAC REAL_LE_MUL2 THEN
2818 ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE; REAL_LE_ADD; REAL_LE_INV_EQ;
2819 REAL_POS; REAL_LT_IMP_LE] THEN
2820 CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN
2821 MATCH_MP_TAC REAL_LE_MUL2 THEN
2822 ASM_SIMP_TAC[REAL_LE_MUL; NORM_POS_LE; REAL_LE_ADD; REAL_LE_INV_EQ;
2823 REAL_POS; REAL_LT_IMP_LE] THEN
2825 [MATCH_MP_TAC(NORM_ARITH `norm(y) = b ==> norm(x - y) <= norm(x) + b`) THEN
2826 REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM];
2828 REWRITE_TAC[REAL_ARITH `a + y <= (x + &1) * y <=> a <= x * y`] THEN
2829 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `inv(&1)` THEN
2830 ASM_SIMP_TAC[REAL_LE_INV2; REAL_OF_NUM_LE; REAL_OF_NUM_LT; ARITH;
2831 ARITH_RULE `1 <= n <=> ~(n = 0)`] THEN
2832 ASM_SIMP_TAC[REAL_INV_1; GSYM real_div; REAL_LE_RDIV_EQ] THEN
2833 MP_TAC(SPEC `s:complex` COMPLEX_NORM_GE_RE_IM) THEN REAL_ARITH_TAC);;
2835 let NEARNEWMAN_EXISTS = prove
2836 (`?f. !s. s IN {s | Re(s) > &1 / &2}
2837 ==> ((\p. clog(Cx(&p)) / Cx(&p) * nearzeta p s -
2838 clog(Cx(&p)) / (Cx(&p) cpow s * (Cx(&p) cpow s - Cx(&1))))
2839 sums (f s)) {p | prime p} /\
2840 f complex_differentiable (at s)`,
2841 MATCH_MP_TAC SERIES_DIFFERENTIABLE_COMPARISON_COMPLEX THEN
2842 REWRITE_TAC[OPEN_HALFSPACE_RE_GT] THEN
2843 REWRITE_TAC[IN_ELIM_THM; real_gt] THEN CONJ_TAC THENL
2844 [REPEAT STRIP_TAC THEN MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_SUB THEN
2846 [MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_MUL_AT THEN CONJ_TAC THENL
2848 REWRITE_TAC[ETA_AX] THEN
2849 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_NEARZETA THEN
2850 CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
2851 FIRST_ASSUM(MP_TAC o MATCH_MP PRIME_IMP_NZ) THEN ARITH_TAC];
2853 COMPLEX_DIFFERENTIABLE_TAC THEN
2854 ASM_SIMP_TAC[COMPLEX_ENTIRE; CPOW_EQ_0; CX_INJ; REAL_OF_NUM_EQ;
2855 COMPLEX_SUB_0; PRIME_IMP_NZ; PRIME_GE_2; CPOW_NUM_NE_1;
2856 REAL_ARITH `&1 / &2 < x ==> &0 < x`];
2858 X_GEN_TAC `s:complex` THEN STRIP_TAC THEN
2859 EXISTS_TAC `min (&1 / &2) ((Re s - &1 / &2) / &2)` THEN
2860 EXISTS_TAC `\p. Cx(&2 * (norm(s:complex) + &2) pow 3 + &2) *
2862 Cx(&p) cpow (Cx(&1 + (Re s - &1 / &2) / &4))` THEN
2863 EXISTS_TAC `5` THEN CONJ_TAC THENL
2864 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
2866 [MATCH_MP_TAC SUMMABLE_COMPLEX_LMUL THEN
2867 MATCH_MP_TAC SUMMABLE_SUBSET_COMPLEX THEN EXISTS_TAC `from 1` THEN
2868 SIMP_TAC[IN_FROM; SUBSET; IN_ELIM_THM; GSYM CX_LOG; CPOW_REAL_REAL;
2869 RE_CX; REAL_CX; REAL_OF_NUM_LT; LE_1; PRIME_IMP_NZ] THEN
2870 SIMP_TAC[GSYM CX_DIV; REAL_CX; RE_CX; LOG_POS; REAL_OF_NUM_LE;
2871 REAL_LE_DIV; REAL_EXP_POS_LE] THEN
2872 REWRITE_TAC[summable] THEN
2874 `--(complex_derivative zeta (Cx(&1 + (Re s - &1 / &2) / &4)))` THEN
2875 GEN_REWRITE_TAC (RATOR_CONV o LAND_CONV o ABS_CONV)
2876 [GSYM COMPLEX_NEG_NEG] THEN
2877 MATCH_MP_TAC SERIES_NEG THEN
2878 REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_LNEG] THEN
2879 REWRITE_TAC[GSYM complex_div] THEN
2880 MATCH_MP_TAC COMPLEX_DERIVATIVE_ZETA_CONVERGES THEN
2881 REWRITE_TAC[RE_CX] THEN ASM_REAL_ARITH_TAC;
2883 CONJ_TAC THEN X_GEN_TAC `p:num` THENL
2884 [SIMP_TAC[CPOW_REAL_REAL; REAL_CX; RE_CX; GSYM CX_LOG; REAL_OF_NUM_LT;
2885 LT_NZ; PRIME_IMP_NZ; GSYM CX_DIV; GSYM CX_MUL] THEN
2886 DISCH_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL
2887 [MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 <= &2 * x + &2`) THEN
2888 MATCH_MP_TAC REAL_POW_LE THEN NORM_ARITH_TAC;
2889 MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_EXP_POS_LE] THEN
2890 ASM_SIMP_TAC[LOG_POS; REAL_OF_NUM_LE; ARITH_RULE `2 <= p ==> 1 <= p`;
2893 X_GEN_TAC `z:complex` THEN
2894 REWRITE_TAC[IN_BALL; REAL_LT_MIN; dist] THEN STRIP_TAC THEN
2895 REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
2896 MATCH_MP_TAC(REAL_ARITH
2897 `x <= a * b /\ a * b <= abs a * b ==> x <= abs a * b`) THEN
2898 SIMP_TAC[REAL_LE_RMUL; NORM_POS_LE; REAL_ABS_LE] THEN
2899 GEN_REWRITE_TAC RAND_CONV [REAL_ADD_RDISTRIB] THEN
2900 MATCH_MP_TAC(NORM_ARITH
2901 `norm(x) <= a /\ norm(y) <= b ==> norm(x - y) <= a + b`) THEN
2903 [REWRITE_TAC[CPOW_ADD; CX_ADD; CPOW_N; CX_INJ; REAL_OF_NUM_EQ] THEN
2904 ASM_SIMP_TAC[complex_div; COMPLEX_INV_MUL; COMPLEX_MUL_ASSOC] THEN
2905 ASM_SIMP_TAC[PRIME_IMP_NZ; GSYM complex_div] THEN
2906 ONCE_REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV] THEN
2907 REWRITE_TAC[COMPLEX_POW_1; real_div] THEN
2908 ONCE_REWRITE_TAC[AC REAL_MUL_AC `x * a * b:real = a * x * b`] THEN
2909 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
2910 W(MP_TAC o PART_MATCH (lhand o rand) NEARZETA_BOUND o lhand o snd) THEN
2911 ASM_SIMP_TAC[PRIME_IMP_NZ] THEN
2912 MATCH_MP_TAC(TAUT `a /\ (a ==> b ==> c) ==> (a ==> b) ==> c`) THEN
2914 [ASM_SIMP_TAC[PRIME_IMP_NZ] THEN
2915 MP_TAC(SPEC `s - z:complex` COMPLEX_NORM_GE_RE_IM) THEN
2916 REWRITE_TAC[RE_SUB] THEN ASM_REAL_ARITH_TAC;
2918 MATCH_MP_TAC(REAL_ARITH `a <= b ==> x <= a ==> x <= b`) THEN
2919 ONCE_REWRITE_TAC[REAL_ARITH `(&2 * x) * y = x * &2 * y`] THEN
2920 REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
2921 MATCH_MP_TAC REAL_LE_MUL2 THEN
2922 ASM_SIMP_TAC[NORM_POS_LE; REAL_POW_LE; REAL_LE_INV_EQ; REAL_LE_MUL;
2923 REAL_LT_IMP_LE; REAL_POS; REAL_LE_ADD; GSYM REAL_INV_MUL;
2924 REAL_EXP_POS_LE] THEN
2926 [MATCH_MP_TAC REAL_POW_LE2 THEN ASM_NORM_ARITH_TAC; ALL_TAC] THEN
2927 REWRITE_TAC[REAL_INV_MUL] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
2928 ASM_SIMP_TAC[REAL_LE_INV_EQ; REAL_LT_IMP_LE; REAL_EXP_POS_LE] THEN
2930 [GEN_REWRITE_TAC RAND_CONV [GSYM REAL_INV_INV] THEN
2931 MATCH_MP_TAC REAL_LE_INV2 THEN
2932 MP_TAC(SPEC `s - z:complex` COMPLEX_NORM_GE_RE_IM) THEN
2933 REWRITE_TAC[RE_SUB] THEN ASM_REAL_ARITH_TAC;
2935 ASM_SIMP_TAC[NORM_CPOW_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT; PRIME_IMP_NZ;
2937 REWRITE_TAC[GSYM REAL_EXP_NEG; REAL_EXP_MONO_LE] THEN
2938 REWRITE_TAC[REAL_ARITH `--(a * p) <= --(b * p) <=> b * p <= a * p`] THEN
2939 MATCH_MP_TAC REAL_LE_RMUL THEN
2940 ASM_SIMP_TAC[LOG_POS; REAL_OF_NUM_LE; ARITH_RULE `2 <= p ==> 1 <= p`;
2942 MP_TAC(SPEC `s - z:complex` COMPLEX_NORM_GE_RE_IM) THEN
2943 REWRITE_TAC[RE_SUB] THEN ASM_REAL_ARITH_TAC;
2945 MATCH_MP_TAC(REAL_ARITH
2946 `!y:complex. norm(x) <= &2 * norm(y) /\ norm(y) <= a
2947 ==> norm(x) <= &2 * a`) THEN
2948 EXISTS_TAC `clog(Cx(&p)) / Cx(&p) cpow (z + z)` THEN CONJ_TAC THENL
2949 [REWRITE_TAC[CPOW_ADD; complex_div; COMPLEX_MUL_ASSOC; COMPLEX_INV_MUL] THEN
2950 REWRITE_TAC[GSYM complex_div] THEN
2951 ONCE_REWRITE_TAC[COMPLEX_NORM_DIV] THEN
2952 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2953 REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
2954 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
2955 GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [GSYM REAL_INV_INV] THEN
2956 REWRITE_TAC[GSYM REAL_INV_MUL] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
2957 REWRITE_TAC[REAL_ARITH `&0 < x * inv(&2) <=> &0 < x`; COMPLEX_NORM_NZ] THEN
2958 ASM_SIMP_TAC[CPOW_EQ_0; CX_INJ; REAL_OF_NUM_EQ; PRIME_IMP_NZ;
2960 MATCH_MP_TAC(NORM_ARITH
2961 `&2 <= norm(a) /\ norm(b) = &1 ==> norm(a) * inv(&2) <= norm(a - b)`) THEN
2962 REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
2963 ASM_SIMP_TAC[NORM_CPOW_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT;
2964 ARITH_RULE `5 <= p ==> 0 < p`] THEN
2965 SUBST1_TAC(SYM(MATCH_MP EXP_LOG (REAL_ARITH `&0 < &2`))) THEN
2966 REWRITE_TAC[REAL_EXP_MONO_LE] THEN MATCH_MP_TAC REAL_LE_TRANS THEN
2967 EXISTS_TAC `&1 / &2 * log(&4)` THEN
2968 SIMP_TAC[REAL_ARITH `l <= &1 / &2 * x <=> &2 * l <= x`;
2969 GSYM LOG_POW; REAL_OF_NUM_LT; ARITH] THEN
2970 CONV_TAC REAL_RAT_REDUCE_CONV THEN REWRITE_TAC[REAL_LE_REFL] THEN
2971 MATCH_MP_TAC REAL_LE_MUL2 THEN
2972 ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; LOG_POS; REAL_OF_NUM_LE; ARITH;
2973 LOG_MONO_LE_IMP; REAL_OF_NUM_LT;
2974 ARITH_RULE `5 <= p ==> 4 <= p`] THEN
2975 MP_TAC(SPEC `s - z:complex` COMPLEX_NORM_GE_RE_IM) THEN
2976 REWRITE_TAC[RE_SUB] THEN ASM_REAL_ARITH_TAC;
2978 REWRITE_TAC[COMPLEX_NORM_DIV; real_div] THEN
2979 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
2980 ASM_SIMP_TAC[NORM_CPOW_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT;
2981 ARITH_RULE `5 <= p ==> 0 < p`] THEN
2982 REWRITE_TAC[GSYM REAL_EXP_NEG; REAL_EXP_MONO_LE] THEN
2983 REWRITE_TAC[REAL_ARITH `--(a * p) <= --(b * p) <=> b * p <= a * p`] THEN
2984 MATCH_MP_TAC REAL_LE_RMUL THEN
2985 ASM_SIMP_TAC[LOG_POS; REAL_OF_NUM_LE; ARITH_RULE `2 <= p ==> 1 <= p`;
2987 MP_TAC(SPEC `s - z:complex` COMPLEX_NORM_GE_RE_IM) THEN
2988 REWRITE_TAC[RE_SUB; RE_ADD] THEN ASM_REAL_ARITH_TAC);;
2990 let nearnewman = new_specification ["nearnewman"] NEARNEWMAN_EXISTS;;
2992 let [CONVERGES_NEARNEWMAN; COMPLEX_DIFFERENTIABLE_NEARNEWMAN] =
2993 CONJUNCTS(REWRITE_RULE[FORALL_AND_THM; IN_ELIM_THM; real_gt;
2994 TAUT `a ==> b /\ c <=> (a ==> b) /\ (a ==> c)`]
2997 let newman = new_definition
2998 `newman(s) = (nearnewman(s) - (complex_derivative zeta s / zeta s)) /
3001 (* ------------------------------------------------------------------------- *)
3002 (* Careful correlation of singularities of the various functions. *)
3003 (* ------------------------------------------------------------------------- *)
3005 let COMPLEX_DERIVATIVE_ZETA = prove
3006 (`!s. &0 < Re s /\ ~(s = Cx(&1))
3007 ==> complex_derivative zeta s =
3008 complex_derivative (nearzeta 1) s / (s - Cx(&1)) -
3009 (nearzeta 1 s + Cx(&1)) / (s - Cx(&1)) pow 2`,
3010 REPEAT STRIP_TAC THEN MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_DERIVATIVE THEN
3011 REWRITE_TAC[REWRITE_RULE[GSYM FUN_EQ_THM; ETA_AX] (GEN_ALL zeta);
3012 REWRITE_RULE[GSYM FUN_EQ_THM; ETA_AX] (GEN_ALL genzeta)] THEN
3013 REWRITE_TAC[CPOW_1; complex_div; COMPLEX_MUL_LID; COMPLEX_INV_1] THEN
3014 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_TRANSFORM_AT THEN
3015 EXISTS_TAC `\s. (nearzeta 1 s + Cx(&1)) * inv(s - Cx(&1))` THEN
3016 EXISTS_TAC `dist(Cx(&1),s)` THEN ASM_SIMP_TAC[DIST_POS_LT] THEN
3018 [X_GEN_TAC `w:complex` THEN COND_CASES_TAC THEN
3019 ASM_REWRITE_TAC[REAL_LT_REFL];
3022 [`\z. nearzeta 1 z + Cx(&1)`; `complex_derivative(nearzeta 1) s`;
3023 `\z. inv(z - Cx(&1))`;
3024 `--Cx(&1) / (s - Cx(&1)) pow 2`;
3026 HAS_COMPLEX_DERIVATIVE_MUL_AT) THEN
3027 REWRITE_TAC[] THEN ANTS_TAC THENL
3029 MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
3030 SIMPLE_COMPLEX_ARITH_TAC] THEN
3033 COMPLEX_DIFF_TAC THEN REPEAT(POP_ASSUM MP_TAC) THEN
3034 CONV_TAC COMPLEX_FIELD] THEN
3035 GEN_REWRITE_TAC LAND_CONV [GSYM COMPLEX_ADD_RID] THEN
3036 MATCH_MP_TAC HAS_COMPLEX_DERIVATIVE_ADD THEN
3037 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_CONST] THEN
3038 REWRITE_TAC[HAS_COMPLEX_DERIVATIVE_DIFFERENTIABLE; ETA_AX] THEN
3039 MP_TAC(SPEC `1` HOLOMORPHIC_NEARZETA) THEN
3040 SIMP_TAC[ARITH; HOLOMORPHIC_ON_OPEN; OPEN_HALFSPACE_RE_GT] THEN
3041 ASM_SIMP_TAC[IN_ELIM_THM; GSYM complex_differentiable; real_gt]);;
3043 let ANALYTIC_ZETA_DERIVDIFF = prove
3044 (`?a. (\z. if z = Cx(&1) then a
3045 else (z - Cx(&1)) * complex_derivative zeta z -
3046 complex_derivative zeta z / zeta z)
3047 analytic_on {s | Re(s) >= &1}`,
3050 (\z. (Cx(&1) - inv(nearzeta 1 z + Cx(&1))) *
3051 ((z - Cx(&1)) * complex_derivative (nearzeta 1) z -
3052 (nearzeta 1 z + Cx(&1)))) (Cx(&1))` THEN
3053 MATCH_MP_TAC POLE_THEOREM_ANALYTIC_0 THEN
3054 MAP_EVERY EXISTS_TAC
3055 [`\z. (Cx(&1) - inv(nearzeta 1 z + Cx(&1))) *
3056 ((z - Cx(&1)) * complex_derivative (nearzeta 1) z -
3057 (nearzeta 1 z + Cx(&1)))`;
3059 SIMP_TAC[NEARZETA_1; ARITH] THEN
3060 REWRITE_TAC[COMPLEX_ADD_LID; COMPLEX_INV_1; COMPLEX_SUB_REFL;
3061 COMPLEX_MUL_LZERO] THEN
3063 [MATCH_MP_TAC ANALYTIC_ON_MUL THEN CONJ_TAC THENL
3064 [MATCH_MP_TAC ANALYTIC_ON_SUB THEN REWRITE_TAC[ANALYTIC_ON_CONST] THEN
3065 MATCH_MP_TAC ANALYTIC_ON_INV THEN
3066 ASM_SIMP_TAC[IN_ELIM_THM; real_ge; NEARZETA_NONZERO] THEN
3067 MATCH_MP_TAC ANALYTIC_ON_ADD THEN REWRITE_TAC[ANALYTIC_ON_CONST; ETA_AX];
3068 MATCH_MP_TAC ANALYTIC_ON_SUB THEN CONJ_TAC THENL
3069 [MATCH_MP_TAC ANALYTIC_ON_MUL THEN
3070 SIMP_TAC[ETA_AX; ANALYTIC_ON_SUB; ANALYTIC_ON_CONST;
3071 ANALYTIC_ON_ID] THEN MATCH_MP_TAC ANALYTIC_COMPLEX_DERIVATIVE;
3072 MATCH_MP_TAC ANALYTIC_ON_ADD THEN
3073 REWRITE_TAC[ANALYTIC_ON_CONST; ETA_AX]]] THEN
3074 MATCH_MP_TAC ANALYTIC_ON_SUBSET THEN EXISTS_TAC `{s | Re(s) > &0}` THEN
3075 REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN
3076 SIMP_TAC[ETA_AX; ANALYTIC_ON_OPEN; OPEN_HALFSPACE_RE_GT;
3077 HOLOMORPHIC_NEARZETA; LE_REFL] THEN REAL_ARITH_TAC;
3078 X_GEN_TAC `z:complex` THEN REWRITE_TAC[IN_ELIM_THM; real_ge] THEN
3079 DISCH_TAC THEN FIRST_ASSUM(ASSUME_TAC o MATCH_MP NEARZETA_NONZERO) THEN
3080 MP_TAC(ISPECL [`\z. nearzeta 1 z + Cx(&1)`; `z:complex`; `Cx(&0)`]
3081 CONTINUOUS_AT_AVOID) THEN
3083 [ASM_REWRITE_TAC[] THEN
3084 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_IMP_CONTINUOUS_AT THEN
3085 MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_ADD THEN
3086 REWRITE_TAC[COMPLEX_DIFFERENTIABLE_CONST; ETA_AX] THEN
3087 MP_TAC(SPEC `1` HOLOMORPHIC_NEARZETA) THEN
3088 SIMP_TAC[ARITH; HOLOMORPHIC_ON_OPEN; OPEN_HALFSPACE_RE_GT] THEN
3089 REWRITE_TAC[complex_differentiable; IN_ELIM_THM] THEN
3090 DISCH_THEN MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC;
3092 REWRITE_TAC[] THEN DISCH_THEN(X_CHOOSE_THEN `e:real` STRIP_ASSUME_TAC) THEN
3093 EXISTS_TAC `min e (&1)` THEN ASM_REWRITE_TAC[REAL_LT_MIN; REAL_LT_01] THEN
3094 REWRITE_TAC[BALL_MIN_INTER; IN_INTER; IN_BALL; REAL_LT_MIN] THEN
3095 X_GEN_TAC `w:complex` THEN STRIP_TAC THEN
3096 SUBGOAL_THEN `&0 < Re w` ASSUME_TAC THENL
3097 [MP_TAC(SPEC `z - w:complex` COMPLEX_NORM_GE_RE_IM) THEN
3098 REWRITE_TAC[RE_SUB] THEN ASM_NORM_ARITH_TAC;
3100 ASM_SIMP_TAC[COMPLEX_DERIVATIVE_ZETA] THEN
3101 ASM_REWRITE_TAC[REWRITE_RULE[GSYM FUN_EQ_THM] zeta; genzeta] THEN
3102 REWRITE_TAC[CPOW_1; COMPLEX_DIV_1] THEN
3103 FIRST_X_ASSUM(MP_TAC o SPEC `w:complex`) THEN ASM_REWRITE_TAC[] THEN
3104 UNDISCH_TAC `~(w = Cx(&1))` THEN CONV_TAC COMPLEX_FIELD]);;
3106 let ANALYTIC_NEWMAN_VARIANT = prove
3107 (`?c a. (\z. if z = Cx(&1) then a
3108 else newman z + complex_derivative zeta z + c * zeta z)
3109 analytic_on {s | Re(s) >= &1}`,
3110 X_CHOOSE_TAC `c:complex` ANALYTIC_ZETA_DERIVDIFF THEN
3111 EXISTS_TAC `--(c + nearnewman(Cx(&1)))` THEN
3117 else (z - Cx(&1)) * complex_derivative zeta z -
3118 complex_derivative zeta z / zeta z) +
3119 --(c + nearnewman (Cx(&1))) * (nearzeta 1 z + Cx(&1)))
3121 MATCH_MP_TAC POLE_THEOREM_ANALYTIC_0 THEN
3122 MAP_EVERY EXISTS_TAC
3123 [`\z. nearnewman z +
3124 (if z = Cx(&1) then c
3125 else (z - Cx(&1)) * complex_derivative zeta z -
3126 complex_derivative zeta z / zeta z) +
3127 --(c + nearnewman(Cx(&1))) * (nearzeta 1 z + Cx(&1))`;
3129 SIMP_TAC[NEARZETA_1; LE_REFL] THEN REPEAT CONJ_TAC THENL
3130 [MATCH_MP_TAC ANALYTIC_ON_ADD THEN CONJ_TAC THENL
3131 [MATCH_MP_TAC ANALYTIC_ON_SUBSET THEN
3132 EXISTS_TAC `{s | Re(s) > &1 / &2}` THEN
3133 SIMP_TAC[SUBSET; IN_ELIM_THM; ANALYTIC_ON_OPEN; OPEN_HALFSPACE_RE_GT;
3134 HOLOMORPHIC_ON_OPEN; real_gt; GSYM complex_differentiable;
3135 COMPLEX_DIFFERENTIABLE_NEARNEWMAN] THEN
3137 MATCH_MP_TAC ANALYTIC_ON_ADD THEN ASM_REWRITE_TAC[] THEN
3138 MATCH_MP_TAC ANALYTIC_ON_MUL THEN REWRITE_TAC[ANALYTIC_ON_CONST] THEN
3139 MATCH_MP_TAC ANALYTIC_ON_ADD THEN REWRITE_TAC[ANALYTIC_ON_CONST] THEN
3140 MATCH_MP_TAC ANALYTIC_ON_SUBSET THEN EXISTS_TAC `{s | Re(s) > &0}` THEN
3141 REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN
3142 SIMP_TAC[ETA_AX; ANALYTIC_ON_OPEN; OPEN_HALFSPACE_RE_GT;
3143 HOLOMORPHIC_NEARZETA; LE_REFL] THEN REAL_ARITH_TAC];
3144 REPEAT STRIP_TAC THEN EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_LT_01] THEN
3145 X_GEN_TAC `w:complex` THEN STRIP_TAC THEN REWRITE_TAC[newman] THEN
3146 GEN_REWRITE_TAC (funpow 4 RAND_CONV o ONCE_DEPTH_CONV) [zeta] THEN
3147 ASM_REWRITE_TAC[genzeta; CPOW_1; COMPLEX_DIV_1] THEN
3148 UNDISCH_TAC `~(w = Cx(&1))` THEN CONV_TAC COMPLEX_FIELD;
3149 SIMPLE_COMPLEX_ARITH_TAC]);;
3151 (* ------------------------------------------------------------------------- *)
3152 (* Hence apply the analytic lemma. *)
3153 (* ------------------------------------------------------------------------- *)
3155 let CONVERGES_NEWMAN_PRIME = prove
3157 ==> ((\p. clog(Cx(&p)) / Cx(&p) * genzeta p s) sums newman(s))
3159 X_GEN_TAC `s:complex` THEN ASM_CASES_TAC `s = Cx(&1)` THEN
3160 ASM_REWRITE_TAC[RE_CX; REAL_LT_REFL; genzeta; newman] THEN
3161 DISCH_TAC THEN REWRITE_TAC[complex_div; COMPLEX_MUL_ASSOC] THEN
3162 MATCH_MP_TAC SERIES_COMPLEX_RMUL THEN REWRITE_TAC[GSYM complex_div] THEN
3163 FIRST_ASSUM(MP_TAC o MATCH_MP CONVERGES_LOGZETA'') THEN
3164 FIRST_ASSUM(MP_TAC o MATCH_MP CONVERGES_NEARNEWMAN o MATCH_MP
3165 (REAL_ARITH `&1 < x ==> &1 / &2 < x`)) THEN
3166 REWRITE_TAC[IMP_IMP] THEN DISCH_THEN(MP_TAC o MATCH_MP SERIES_ADD) THEN
3167 REWRITE_TAC[GSYM complex_sub] THEN MATCH_MP_TAC EQ_IMP THEN
3168 MATCH_MP_TAC SUMS_IFF THEN X_GEN_TAC `p:num` THEN
3169 REWRITE_TAC[IN_ELIM_THM] THEN DISCH_TAC THEN
3170 MATCH_MP_TAC(COMPLEX_RING
3171 `c - b = a * m ==> (a:complex) * n - b + c = a * (n + m)`) THEN
3172 ASM_SIMP_TAC[CX_LOG; REAL_OF_NUM_LT; LT_NZ; PRIME_IMP_NZ; complex_div] THEN
3173 REWRITE_TAC[GSYM COMPLEX_MUL_ASSOC; GSYM COMPLEX_SUB_LDISTRIB] THEN
3174 AP_TERM_TAC THEN REWRITE_TAC[COMPLEX_MUL_LID; GSYM COMPLEX_INV_MUL] THEN
3175 ASM_SIMP_TAC[CPOW_SUB; CPOW_N; CX_INJ; REAL_OF_NUM_EQ; PRIME_IMP_NZ] THEN
3176 REWRITE_TAC[COMPLEX_POW_1] THEN
3177 MATCH_MP_TAC(COMPLEX_FIELD
3178 `~(ps = Cx(&1)) /\ ~(ps = Cx(&0)) /\ ~(p = Cx(&0))
3179 ==> inv(ps - Cx(&1)) - inv(ps * (ps - Cx(&1))) =
3180 inv(p * ps / p)`) THEN
3181 ASM_SIMP_TAC[CPOW_NUM_NE_1; PRIME_GE_2; REAL_ARITH `&1 < x ==> &0 < x`] THEN
3182 ASM_SIMP_TAC[CPOW_EQ_0; CX_INJ; REAL_OF_NUM_EQ; PRIME_IMP_NZ]);;
3184 (* ------------------------------------------------------------------------- *)
3185 (* Now swap the order of summation in the series. *)
3186 (* ------------------------------------------------------------------------- *)
3188 let GENZETA_OFFSET = prove
3189 (`!m n s. &1 < Re s /\ m <= n
3190 ==> genzeta m s - vsum(m..n) (\k. Cx(&1) / Cx(&k) cpow s) =
3192 REPEAT STRIP_TAC THEN MATCH_MP_TAC SERIES_UNIQUE THEN
3193 MAP_EVERY EXISTS_TAC [`\k. Cx(&1) / Cx(&k) cpow s`; `from(n + 1)`] THEN
3194 ASM_SIMP_TAC[GENZETA_CONVERGES] THEN
3195 GEN_REWRITE_TAC (PAT_CONV `\n. (f sums (a - vsum(m..n) s)) k`)
3196 [ARITH_RULE `n = (n + 1) - 1`] THEN
3197 MATCH_MP_TAC SUMS_OFFSET THEN ASM_SIMP_TAC[GENZETA_CONVERGES] THEN
3200 let NEWMAN_CONVERGES = prove
3202 ==> ((\n. vsum {p | prime p /\ p <= n} (\p. clog(Cx(&p)) / Cx(&p)) /
3204 sums (newman s)) (from 1)`,
3206 (`vsum (1..n) (\m. vsum {p | prime p /\ p <= m} (\p. f p m)) =
3207 vsum {p | prime p /\ p <= n} (\p. vsum (p..n) (\m. f p m))`,
3208 SIMP_TAC[VSUM_VSUM_PRODUCT; FINITE_NUMSEG; FINITE_ATMOST] THEN
3209 REWRITE_TAC[IN_ELIM_THM; IN_NUMSEG; GSYM CONJ_ASSOC] THEN
3210 MATCH_MP_TAC VSUM_EQ_GENERAL_INVERSES THEN
3211 REPEAT(EXISTS_TAC `\(x:num,y:num). (y,x)`) THEN
3212 REWRITE_TAC[FORALL_PAIR_THM; IN_ELIM_PAIR_THM] THEN
3213 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
3214 FIRST_ASSUM(MP_TAC o MATCH_MP PRIME_IMP_NZ) THEN ASM_ARITH_TAC) in
3215 REPEAT STRIP_TAC THEN
3216 REWRITE_TAC[sums; FROM_INTER_NUMSEG; LIM_SEQUENTIALLY] THEN
3217 X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3218 FIRST_ASSUM(MP_TAC o MATCH_MP CONVERGES_NEWMAN_PRIME) THEN
3219 GEN_REWRITE_TAC LAND_CONV [sums] THEN
3220 SUBGOAL_THEN `!n. {p | prime p} INTER (0..n) = {p | prime p /\ p <= n}`
3221 (fun th -> REWRITE_TAC[th])
3222 THENL [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_INTER; IN_NUMSEG; LE_0];
3224 REWRITE_TAC[LIM_SEQUENTIALLY] THEN
3225 DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
3226 REWRITE_TAC[dist] THEN
3227 DISCH_THEN(X_CHOOSE_THEN `N0:num` (LABEL_TAC "0")) THEN
3229 `((\n. Cx(&1 + &1 / (Re s - &1)) *
3230 (clog(Cx(&n)) + Cx(&24)) / Cx(&n) cpow (s - Cx(&1)))
3231 --> Cx(&0)) sequentially`
3233 [MATCH_MP_TAC LIM_NULL_COMPLEX_LMUL THEN
3234 REWRITE_TAC[complex_div; COMPLEX_ADD_RDISTRIB] THEN
3235 MATCH_MP_TAC LIM_NULL_COMPLEX_ADD THEN CONJ_TAC THENL
3236 [REWRITE_TAC[GSYM complex_div] THEN MATCH_MP_TAC LIM_LOG_OVER_POWER_N;
3237 MATCH_MP_TAC LIM_NULL_COMPLEX_LMUL THEN
3238 ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `inv x = Cx(&1) / x`] THEN
3239 MATCH_MP_TAC LIM_1_OVER_POWER] THEN
3240 REWRITE_TAC[RE_SUB; RE_CX] THEN ASM_REAL_ARITH_TAC;
3242 REWRITE_TAC[LIM_SEQUENTIALLY; dist; COMPLEX_SUB_RZERO] THEN
3243 DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
3244 DISCH_THEN(X_CHOOSE_THEN `N1:num` (LABEL_TAC "1")) THEN
3245 EXISTS_TAC `N0 + N1 + 1` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
3246 REMOVE_THEN "0" (MP_TAC o SPEC `n:num`) THEN
3247 ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
3248 MATCH_MP_TAC(NORM_ARITH
3249 `norm(x - y) <= e / &2 ==> norm(x - a) < e / &2 ==> norm(y - a) < e`) THEN
3250 SIMP_TAC[complex_div; GSYM VSUM_COMPLEX_RMUL; FINITE_ATMOST] THEN
3251 REWRITE_TAC[GSYM complex_div] THEN REWRITE_TAC[lemma] THEN
3252 SIMP_TAC[FINITE_ATMOST; GSYM VSUM_SUB] THEN SIMP_TAC[complex_div] THEN
3253 SIMP_TAC[COMPLEX_MUL_ASSOC; VSUM_COMPLEX_LMUL; FINITE_NUMSEG] THEN
3254 REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB] THEN SIMP_TAC[GSYM complex_div] THEN
3255 ONCE_REWRITE_TAC[SIMPLE_COMPLEX_ARITH `inv x = Cx(&1) / x`] THEN
3256 MATCH_MP_TAC REAL_LE_TRANS THEN
3258 `norm(vsum {p | prime p /\ p <= n}
3259 (\p. clog(Cx(&p)) / Cx(&p) * genzeta (n + 1) s))` THEN
3261 [MATCH_MP_TAC REAL_EQ_IMP_LE THEN AP_TERM_TAC THEN
3262 MATCH_MP_TAC VSUM_EQ THEN ASM_SIMP_TAC[IN_ELIM_THM; GENZETA_OFFSET];
3264 SIMP_TAC[VSUM_COMPLEX_RMUL; FINITE_ATMOST] THEN
3265 FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN
3266 ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
3267 MATCH_MP_TAC(REAL_ARITH `y <= x ==> x < e ==> y <= e`) THEN
3268 REWRITE_TAC[complex_div] THEN
3269 ONCE_REWRITE_TAC[COMPLEX_RING `a * b * c:complex = b * a * c`] THEN
3270 REWRITE_TAC[GSYM complex_div] THEN REWRITE_TAC[COMPLEX_NORM_MUL] THEN
3271 SUBGOAL_THEN `~(n = 0) /\ 1 <= n` STRIP_ASSUME_TAC THENL
3272 [ASM_ARITH_TAC; ALL_TAC] THEN
3273 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THEN CONJ_TAC THENL
3274 [FIRST_ASSUM(MP_TAC o MATCH_MP MERTENS) THEN
3275 DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
3276 `abs(x - y) <= e ==> &0 <= y ==> abs(x) <= y + e`)) THEN
3277 ASM_SIMP_TAC[LOG_POS; REAL_OF_NUM_LE] THEN
3278 MATCH_MP_TAC(REAL_ARITH
3279 `x' <= x /\ y' = y ==> abs x <= y ==> x' <= y'`) THEN
3281 [MATCH_MP_TAC VSUM_NORM_LE THEN SIMP_TAC[FINITE_ATMOST; IN_ELIM_THM] THEN
3282 X_GEN_TAC `p:num` THEN STRIP_TAC THEN
3283 FIRST_ASSUM(ASSUME_TAC o MATCH_MP PRIME_IMP_NZ) THEN
3284 ASM_SIMP_TAC[GSYM CX_LOG; REAL_OF_NUM_LT; LT_NZ] THEN
3285 REWRITE_TAC[GSYM CX_DIV; COMPLEX_NORM_CX] THEN
3286 MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x <= x`) THEN
3287 ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; LOG_POS; REAL_OF_NUM_LE; LE_1];
3288 ASM_SIMP_TAC[GSYM CX_LOG; REAL_OF_NUM_LT; LT_NZ] THEN
3289 REWRITE_TAC[GSYM CX_ADD; COMPLEX_NORM_CX] THEN
3290 MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN
3291 ASM_SIMP_TAC[REAL_LE_ADD; REAL_POS; LOG_POS; REAL_OF_NUM_LE; LE_1]];
3292 MP_TAC(SPECL [`n + 1`; `s:complex`] GENZETA_BOUND) THEN
3293 ASM_REWRITE_TAC[ADD_EQ_0; ARITH] THEN
3294 MATCH_MP_TAC(REAL_ARITH `a <= b ==> x <= a ==> x <= b`) THEN
3295 REWRITE_TAC[complex_div; COMPLEX_NORM_MUL] THEN
3296 MATCH_MP_TAC REAL_LE_MUL2 THEN
3297 ASM_SIMP_TAC[REAL_LE_ADD; REAL_LE_DIV; REAL_POS; REAL_SUB_LE;
3298 REAL_LT_IMP_LE; REAL_EXP_POS_LE] THEN
3300 [REWRITE_TAC[COMPLEX_NORM_CX] THEN
3301 MATCH_MP_TAC(REAL_ARITH `a <= &1 ==> a + b <= abs(&1 + b)`) THEN
3302 REWRITE_TAC[real_div; REAL_MUL_LID] THEN MATCH_MP_TAC REAL_INV_LE_1 THEN
3303 REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC;
3305 ASM_SIMP_TAC[COMPLEX_NORM_INV; NORM_CPOW_REAL; REAL_CX;
3306 RE_CX; REAL_OF_NUM_LT; LT_NZ] THEN
3307 REWRITE_TAC[GSYM REAL_EXP_NEG; REAL_EXP_MONO_LE; RE_SUB; RE_CX] THEN
3308 REWRITE_TAC[REAL_ARITH `(&1 - s) * l <= --((s - &1) * m) <=>
3309 (s - &1) * m <= (s - &1) * l`] THEN
3310 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; REAL_SUB_LT] THEN
3311 MATCH_MP_TAC LOG_MONO_LE_IMP THEN
3312 ASM_REWRITE_TAC[GSYM REAL_OF_NUM_ADD; REAL_OF_NUM_LT; LT_NZ] THEN
3315 (* ------------------------------------------------------------------------- *)
3316 (* Hence the main result of the analytic part. *)
3317 (* ------------------------------------------------------------------------- *)
3319 let MAIN_RESULT = prove
3320 (`?c. summable (from 1)
3321 (\n. (vsum {p | prime p /\ p <= n} (\p. clog(Cx(&p)) / Cx(&p)) -
3322 clog(Cx(&n)) + c) / Cx(&n))`,
3323 MP_TAC ANALYTIC_NEWMAN_VARIANT THEN REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
3324 MAP_EVERY X_GEN_TAC [`c:complex`; `singval:complex`] THEN DISCH_TAC THEN
3325 EXISTS_TAC `c:complex` THEN MP_TAC(SPECL
3326 [`\z. if z = Cx(&1) then singval
3327 else newman z + complex_derivative zeta z + c * zeta z`;
3328 `\n. vsum {p | prime p /\ p <= n} (\p. clog(Cx(&p)) / Cx(&p)) -
3330 `&24 + norm(c:complex)`]
3331 NEWMAN_INGHAM_THEOREM_STRONG) THEN
3332 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
3334 DISCH_THEN(MP_TAC o SPEC `Cx(&1)`) THEN
3335 REWRITE_TAC[RE_CX; real_ge; REAL_LE_REFL] THEN
3336 DISCH_THEN(MP_TAC o MATCH_MP SUMS_SUMMABLE) THEN
3337 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] SUMMABLE_EQ) THEN
3338 SIMP_TAC[IN_FROM; CPOW_N; CX_INJ; REAL_OF_NUM_EQ] THEN
3339 SIMP_TAC[LE_1; COMPLEX_POW_1]] THEN
3341 [X_GEN_TAC `n:num` THEN DISCH_TAC THEN
3342 MATCH_MP_TAC(NORM_ARITH
3343 `norm(x - y) <= &24 ==> norm(x - y + c) <= &24 + norm c`) THEN
3344 MP_TAC(SPEC `n:num` MERTENS) THEN ASM_SIMP_TAC[LE_1] THEN
3345 MATCH_MP_TAC(REAL_ARITH `x = y ==> x <= a ==> y <= a`) THEN
3346 REWRITE_TAC[GSYM COMPLEX_NORM_CX] THEN AP_TERM_TAC THEN
3347 SIMP_TAC[GSYM VSUM_CX; CX_SUB; FINITE_ATMOST] THEN
3348 ASM_SIMP_TAC[GSYM CX_LOG; REAL_OF_NUM_LT; LE_1] THEN
3349 AP_THM_TAC THEN AP_TERM_TAC THEN MATCH_MP_TAC VSUM_EQ THEN
3350 REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN
3351 ASM_SIMP_TAC[GSYM CX_LOG; CX_DIV; REAL_OF_NUM_LT; LT_NZ; PRIME_IMP_NZ];
3353 X_GEN_TAC `z:complex` THEN REWRITE_TAC[real_gt] THEN
3354 COND_CASES_TAC THEN ASM_REWRITE_TAC[RE_CX; REAL_LT_REFL] THEN
3356 REWRITE_TAC[complex_div; COMPLEX_ADD_RDISTRIB; COMPLEX_SUB_RDISTRIB] THEN
3357 REWRITE_TAC[COMPLEX_ADD_ASSOC] THEN MATCH_MP_TAC SERIES_ADD THEN
3360 MATCH_MP_TAC SERIES_COMPLEX_LMUL THEN
3361 FIRST_ASSUM(MP_TAC o MATCH_MP ZETA_CONVERGES) THEN
3362 REWRITE_TAC[complex_div; COMPLEX_MUL_LID]] THEN
3363 REWRITE_TAC[complex_sub] THEN MATCH_MP_TAC SERIES_ADD THEN
3364 REWRITE_TAC[GSYM complex_div] THEN CONJ_TAC THENL
3366 REWRITE_TAC[complex_div; GSYM COMPLEX_MUL_LNEG] THEN
3367 REWRITE_TAC[GSYM complex_div] THEN
3368 ASM_SIMP_TAC[COMPLEX_DERIVATIVE_ZETA_CONVERGES]] THEN
3369 ASM_SIMP_TAC[NEWMAN_CONVERGES]);;
3371 (* ------------------------------------------------------------------------- *)
3372 (* The theorem relating summability and convergence. *)
3373 (* ------------------------------------------------------------------------- *)
3375 let SUM_GOESTOZERO_LEMMA = prove
3377 abs(sum(M..N) (\i. a(i) / &i)) <= d
3378 ==> 0 < M /\ M < N /\ (!n. a(n) + log(&n) <= a(n + 1) + log(&n + &1))
3379 ==> a(M) <= d * &N / (&N - &M) + (&N - &M) / &M /\
3380 --a(N) <= d * &N / (&N - &M) + (&N - &M) / &M`,
3381 REPEAT GEN_TAC THEN STRIP_TAC THEN STRIP_TAC THEN
3382 SUBGOAL_THEN `&0 <= d` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
3383 SUBGOAL_THEN `0 < N` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
3384 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LT]) THEN
3385 MATCH_MP_TAC(REAL_ARITH
3386 `!a. a <= b /\ x <= a /\ y <= a ==> x <= b /\ y <= b`) THEN
3387 EXISTS_TAC `d * &N / (&N - &M) + log(&N / &M)` THEN CONJ_TAC THENL
3388 [REWRITE_TAC[REAL_LE_LADD] THEN
3389 ASM_SIMP_TAC[REAL_FIELD `&0 < m /\ &0 < n
3390 ==> n / m = &1 + (n - m) / m`] THEN
3391 MATCH_MP_TAC LOG_LE THEN MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC;
3393 REWRITE_TAC[GSYM REAL_LE_SUB_RADD] THEN
3394 SUBGOAL_THEN `!m n. &m <= &n ==> a m + log(&m) <= a n + log(&n)`
3396 [REWRITE_TAC[REAL_OF_NUM_LE] THEN MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN
3397 ASM_REWRITE_TAC[ADD1; GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC;
3399 REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN REWRITE_TAC[GSYM real_div] THEN
3401 (MATCH_MP_TAC REAL_LE_TRANS THEN
3402 EXISTS_TAC `(d * &N) / (&N - &M + &1)` THEN CONJ_TAC THENL
3404 REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
3405 ASM_SIMP_TAC[REAL_POS; REAL_LE_MUL] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
3406 ASM_REAL_ARITH_TAC]) THEN
3407 MATCH_MP_TAC(REAL_ARITH
3408 `&0 <= y /\ (&0 <= x ==> x <= y) ==> x <= y`) THEN
3409 ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_ARITH `m < n ==> &0 < n - m + &1`;
3410 REAL_LE_DIV; REAL_LE_MUL; REAL_MUL_LZERO; REAL_POS] THEN
3411 DISCH_TAC THEN ASM_SIMP_TAC[GSYM REAL_LE_LDIV_EQ] THEN
3412 REWRITE_TAC[real_div] THEN
3413 ONCE_REWRITE_TAC[REAL_ARITH `(x * y) * z:real = y * (x * z)`] THEN
3414 MATCH_MP_TAC REAL_LE_TRANS THEN
3415 EXISTS_TAC `abs(sum(M..N) (\i. a(i) / &i))` THEN ASM_REWRITE_TAC[] THENL
3416 [MATCH_MP_TAC(REAL_ARITH `x <= a ==> x <= abs a`);
3417 MATCH_MP_TAC(REAL_ARITH `a <= --x ==> x <= abs a`)] THEN
3418 (SUBGOAL_THEN `&N - &M + &1 = &((N + 1) - M)` SUBST1_TAC THENL
3419 [ASM_SIMP_TAC[GSYM REAL_OF_NUM_SUB; GSYM REAL_OF_NUM_ADD; GSYM
3420 REAL_OF_NUM_LE; REAL_ARITH `m < n ==> m <= n + &1`] THEN
3423 REWRITE_TAC[GSYM SUM_CONST_NUMSEG; GSYM SUM_NEG] THEN
3424 MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `n:num` THEN STRIP_TAC THEN
3425 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
3426 (SUBGOAL_THEN `&0 < &n` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC]) THEN
3427 REWRITE_TAC[GSYM REAL_MUL_LNEG; REAL_NEG_SUB; REAL_SUB_RNEG] THEN
3428 REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_TRANS THENL
3429 [EXISTS_TAC `(a M - log(&N * inv(&M))) * inv(&n)` THEN CONJ_TAC THENL
3430 [MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[GSYM real_div] THEN
3431 MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REAL_ARITH_TAC;
3433 MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_LE_INV_EQ; REAL_POS] THEN
3434 ASM_SIMP_TAC[GSYM real_div; LOG_DIV] THEN
3435 MATCH_MP_TAC(REAL_ARITH
3436 `!x'. x' <= x /\ a - (x' - m) <= b ==> a - (x - m) <= b`) THEN
3437 EXISTS_TAC `log(&n)` THEN CONJ_TAC THENL
3438 [MATCH_MP_TAC LOG_MONO_LE_IMP THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
3439 ASM_SIMP_TAC[REAL_ARITH `a - (x - y) <= b <=> a + y <= b + x`];
3440 EXISTS_TAC `(log(&N * inv(&M)) + a N) * inv(&n)` THEN CONJ_TAC THENL
3442 ONCE_REWRITE_TAC[REAL_ARITH `a * x <= a * y <=> --a * y <= --a * x`] THEN
3443 MATCH_MP_TAC REAL_LE_LMUL THEN
3444 ASM_SIMP_TAC[GSYM real_div; REAL_ARITH `--(x + y:real) = --y - x`] THEN
3445 MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REAL_ARITH_TAC] THEN
3446 MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_LE_INV_EQ; REAL_POS] THEN
3447 ASM_SIMP_TAC[GSYM real_div; LOG_DIV] THEN
3448 MATCH_MP_TAC(REAL_ARITH
3449 `!x'. x <= x' /\ a <= y - x' + b ==> a <= y - x + b`) THEN
3450 EXISTS_TAC `log(&n)` THEN CONJ_TAC THENL
3451 [MATCH_MP_TAC LOG_MONO_LE_IMP THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
3452 ASM_SIMP_TAC[REAL_ARITH `a <= x - y + b <=> a + y <= b + x`]]);;
3454 let SUM_GOESTOZERO_THEOREM = prove
3455 (`!a c. ((\i. a(i) / &i) real_sums c) (from 1) /\
3456 (!n. a(n) + log(&n) <= a(n + 1) + log(&n + &1))
3457 ==> (a ---> &0) sequentially`,
3459 (`(!e. &0 < e /\ e < &1 / &4 ==> ?N:num. !n. N <= n ==> f(n) < e)
3460 ==> (!e. &0 < e ==> ?N. !n. N <= n ==> f(n) < e)`,
3461 REPEAT STRIP_TAC THEN
3462 FIRST_X_ASSUM(MP_TAC o SPEC `min e (&1 / &5)`) THEN
3463 ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
3464 MESON_TAC[REAL_LT_MIN]) in
3465 REWRITE_TAC[LEFT_FORALL_IMP_THM; LEFT_EXISTS_AND_THM] THEN
3466 REWRITE_TAC[REAL_SERIES_CAUCHY] THEN REPEAT STRIP_TAC THEN
3467 REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN
3468 MATCH_MP_TAC lemma THEN X_GEN_TAC `e:real` THEN
3469 STRIP_TAC THEN REWRITE_TAC[REAL_SUB_RZERO] THEN
3470 FIRST_X_ASSUM(MP_TAC o SPEC `(e / &8) pow 2`) THEN
3471 ASM_SIMP_TAC[REAL_POW_LT; REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
3472 DISCH_THEN(X_CHOOSE_THEN `N0:num` STRIP_ASSUME_TAC) THEN
3473 MP_TAC(SPEC `e / &4` REAL_ARCH_INV) THEN
3474 ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
3475 DISCH_THEN(X_CHOOSE_THEN `N1:num` STRIP_ASSUME_TAC) THEN
3476 EXISTS_TAC `2 * N0 + N1 + 7` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
3477 MP_TAC(SPEC `&n * e / &4` FLOOR) THEN
3478 MP_TAC(SPEC `&n * e / &4` FLOOR_POS) THEN
3479 ASM_SIMP_TAC[REAL_LE_MUL; REAL_LE_DIV; REAL_POS; REAL_LT_IMP_LE] THEN
3480 DISCH_THEN(X_CHOOSE_THEN `k:num` SUBST_ALL_TAC) THEN STRIP_TAC THEN
3481 SUBGOAL_THEN `0 < k /\ 4 * k <= n` STRIP_ASSUME_TAC THENL
3483 [REWRITE_TAC[LT_NZ] THEN DISCH_THEN SUBST_ALL_TAC THEN
3484 UNDISCH_TAC `&n * e / &4 < &0 + &1` THEN
3485 REWRITE_TAC[REAL_NOT_LT; REAL_ADD_LID] THEN
3486 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&N1 * e / &4` THEN
3488 [ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
3489 ASM_SIMP_TAC[GSYM REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LT_NZ] THEN
3491 MATCH_MP_TAC REAL_LE_RMUL THEN
3492 ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC];
3493 REWRITE_TAC[GSYM REAL_OF_NUM_LE; GSYM REAL_OF_NUM_MUL] THEN
3494 REWRITE_TAC[REAL_ARITH `&4 * x <= y <=> x <= y * inv(&4)`] THEN
3495 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&n * e / &4` THEN
3496 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_LMUL THEN
3497 ASM_REAL_ARITH_TAC];
3499 REWRITE_TAC[GSYM REAL_BOUNDS_LT] THEN CONJ_TAC THENL
3500 [FIRST_X_ASSUM(MP_TAC o SPECL [`n - k:num`; `n:num`]);
3501 FIRST_ASSUM(MP_TAC o SPECL [`n:num`; `n + k:num`])] THEN
3502 (ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
3503 REWRITE_TAC[FROM_INTER_NUMSEG_GEN] THEN
3504 COND_CASES_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
3505 DISCH_THEN(MP_TAC o MATCH_MP REAL_LT_IMP_LE) THEN
3506 DISCH_THEN(MP_TAC o MATCH_MP SUM_GOESTOZERO_LEMMA) THEN
3507 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC])
3509 [DISCH_THEN(MP_TAC o CONJUNCT2) THEN
3510 MATCH_MP_TAC(REAL_ARITH `a < b ==> --x <= a ==> --b < x`);
3511 DISCH_THEN(MP_TAC o CONJUNCT1) THEN
3512 MATCH_MP_TAC(REAL_ARITH `a < b ==> x <= a ==> x < b`)] THEN
3513 ASM_SIMP_TAC[GSYM REAL_OF_NUM_SUB; ARITH_RULE `4 * k <= n ==> k <= n`;
3514 GSYM REAL_OF_NUM_ADD] THEN
3515 REWRITE_TAC[REAL_ARITH `n - (n - k):real = k`;
3516 REAL_ARITH `(n + k) - n:real = k`] THEN
3517 MATCH_MP_TAC(REAL_ARITH
3518 `x < e / &2 /\ y < e / &2 ==> x + y < e`) THEN
3519 ASM_SIMP_TAC[REAL_LT_LMUL_EQ; REAL_ARITH
3520 `(e / &8) pow 2 * x < e / &2 <=> e * e / &16 * x < e * &2`] THEN
3521 REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN REWRITE_TAC[GSYM real_div] THEN
3522 ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_SUB_LT; REAL_OF_NUM_LT;
3523 ARITH_RULE `0 < k /\ 4 * k <= n ==> k < n`;
3524 ARITH_RULE `~(n < 1) ==> 0 < n`] THEN
3526 [MATCH_MP_TAC(REAL_ARITH
3527 `n * e / &4 < k + &1 /\ &1 <= k ==> e / &16 * n < &2 * k`) THEN
3528 ASM_REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC;
3529 MATCH_MP_TAC REAL_LET_TRANS THEN
3530 EXISTS_TAC `&n * e / &4` THEN ASM_REWRITE_TAC[] THEN
3531 ASM_SIMP_TAC[REAL_LT_LMUL_EQ; REAL_ARITH
3532 `n * e / &4 < e / &2 * m <=> e * n < e * &2 * m`] THEN
3533 REWRITE_TAC[REAL_ARITH `n < &2 * (n - k) <=> &2 * k < n`] THEN
3534 REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LT] THEN ASM_ARITH_TAC;
3535 MATCH_MP_TAC(REAL_ARITH
3536 `n * e / &4 < k + &1 /\ &1 <= k /\ (&1 / &4 + e / &16) * k < &1 * k
3537 ==> e / &16 * (n + k) < &2 * k`) THEN
3538 ASM_SIMP_TAC[REAL_LT_RMUL_EQ; REAL_OF_NUM_LE; REAL_OF_NUM_LT;
3539 ARITH_RULE `1 <= n <=> 0 < n`] THEN
3541 MATCH_MP_TAC(REAL_ARITH
3542 `k <= n * e / &4 /\ &0 < n * e ==> k < e / &2 * n`) THEN
3543 ASM_SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT;
3544 ARITH_RULE `~(n < 1) ==> 0 < n`]]);;
3546 (* ------------------------------------------------------------------------- *)
3547 (* Hence transform into the desired limit. *)
3548 (* ------------------------------------------------------------------------- *)
3550 let MERTENS_LIMIT = prove
3551 (`?c. ((\n. sum {p | prime p /\ p <= n} (\p. log(&p) / &p) - log(&n))
3552 ---> c) sequentially`,
3553 X_CHOOSE_THEN `c:complex` MP_TAC MAIN_RESULT THEN
3554 REWRITE_TAC[summable] THEN
3555 DISCH_THEN(X_CHOOSE_THEN `l:complex` STRIP_ASSUME_TAC) THEN
3556 EXISTS_TAC `--Re(c)` THEN ONCE_REWRITE_TAC[REALLIM_NULL] THEN
3557 MATCH_MP_TAC SUM_GOESTOZERO_THEOREM THEN EXISTS_TAC `Re l` THEN
3558 REWRITE_TAC[] THEN CONJ_TAC THENL
3559 [FIRST_ASSUM(MP_TAC o MATCH_MP REAL_SUMS_RE) THEN
3560 REWRITE_TAC[o_DEF] THEN
3561 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_SUMS_EQ) THEN
3562 X_GEN_TAC `n:num` THEN REWRITE_TAC[IN_FROM] THEN DISCH_TAC THEN
3563 ASM_SIMP_TAC[RE_ADD; RE_DIV_CX; RE_SUB; REAL_SUB_RNEG] THEN
3564 AP_THM_TAC THEN AP_TERM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
3565 ASM_SIMP_TAC[GSYM CX_LOG; REAL_OF_NUM_LT; LE_1; RE_CX] THEN
3566 SIMP_TAC[RE_VSUM; FINITE_ATMOST] THEN AP_THM_TAC THEN AP_TERM_TAC THEN
3567 MATCH_MP_TAC SUM_EQ THEN
3568 SIMP_TAC[IN_ELIM_THM; GSYM CX_LOG; REAL_OF_NUM_LT; PRIME_IMP_NZ; LT_NZ;
3569 GSYM CX_DIV; RE_CX];
3570 GEN_TAC THEN REWRITE_TAC[REAL_OF_NUM_ADD] THEN MATCH_MP_TAC(REAL_ARITH
3571 `s <= s' ==> (s - l - c) + l <= (s' - l' - c) + l'`) THEN
3572 MATCH_MP_TAC SUM_SUBSET THEN REWRITE_TAC[FINITE_ATMOST] THEN
3573 REWRITE_TAC[IN_DIFF; IN_ELIM_THM] THEN CONJ_TAC THEN
3574 X_GEN_TAC `p:num` THEN ASM_CASES_TAC `prime p` THEN ASM_REWRITE_TAC[] THENL
3575 [ARITH_TAC; ALL_TAC] THEN
3576 STRIP_TAC THEN MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_POS] THEN
3577 MATCH_MP_TAC LOG_POS THEN FIRST_ASSUM(MP_TAC o MATCH_MP PRIME_GE_2) THEN
3578 REWRITE_TAC[REAL_OF_NUM_LE] THEN ARITH_TAC]);;
3580 (* ------------------------------------------------------------------------- *)
3581 (* Reformulate the PNT using partial summation. *)
3582 (* ------------------------------------------------------------------------- *)
3584 let PNT_PARTIAL_SUMMATION = prove
3585 (`&(CARD {p | prime p /\ p <= n}) =
3587 (\k. &k / log (&k) *
3588 (sum {p | prime p /\ p <= k} (\p. log (&p) / &p) -
3589 sum {p | prime p /\ p <= k - 1} (\p. log (&p) / &p)))`,
3590 REWRITE_TAC[PRIME_ATMOST_ALT] THEN
3591 GEN_REWRITE_TAC LAND_CONV [GSYM REAL_MUL_RID] THEN
3592 SIMP_TAC[GSYM SUM_CONST; FINITE_NUMSEG; FINITE_RESTRICT] THEN
3593 SIMP_TAC[FINITE_NUMSEG; SUM_RESTRICT_SET] THEN
3594 MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `p:num` THEN
3595 REWRITE_TAC[IN_NUMSEG] THEN STRIP_TAC THEN
3596 FIRST_ASSUM(fun th ->
3597 GEN_REWRITE_TAC (PAT_CONV `\x. l = a * (sum(1..x) f - s)`)
3598 [MATCH_MP (ARITH_RULE `1 <= p ==> p = SUC(p - 1)`) th]) THEN
3599 SIMP_TAC[SUM_CLAUSES_NUMSEG; ARITH_RULE `1 <= SUC n`] THEN
3600 REWRITE_TAC[REAL_ADD_SUB] THEN
3601 ASM_SIMP_TAC[ARITH_RULE `1 <= p ==> SUC(p - 1) = p`] THEN
3602 COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_MUL_RZERO] THEN
3603 MATCH_MP_TAC(REAL_FIELD `&0 < x /\ &0 < y ==> &1 = x / y * y / x`) THEN
3604 ASM_SIMP_TAC[LOG_POS_LT; REAL_OF_NUM_LT; LE_1; PRIME_GE_2;
3605 ARITH_RULE `2 <= p ==> 1 < p`]);;
3607 let SUM_PARTIAL_LIMIT = prove
3609 (!k. M <= k ==> &0 < f k) /\
3610 (!k. M <= k ==> f(k) <= f(k + 1)) /\
3611 ((\k. inv(f k)) ---> &0) sequentially /\
3612 (e ---> c) sequentially
3613 ==> ((\n. (sum(1..n) (\k. e(k) * (f(k + 1) - f(k))) - e(n) * f(n + 1)) /
3614 f(n + 1)) ---> &0) sequentially`,
3615 REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
3616 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
3617 DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "g") (LABEL_TAC "e")) THEN
3618 SUBGOAL_THEN `!k:num. M <= k ==> &0 <= f k` ASSUME_TAC THENL
3619 [ASM_SIMP_TAC[REAL_LT_IMP_LE]; ALL_TAC] THEN
3620 SIMP_TAC[tendsto_real] THEN X_GEN_TAC `d:real` THEN DISCH_TAC THEN
3621 SUBGOAL_THEN `?N. (!k. N <= k ==> &0 < f k) /\
3622 (!k. N <= k ==> f(k) <= f(k + 1)) /\
3623 (!k. N <= k ==> abs(e k - c) < d / &4)`
3624 (X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC)
3626 [USE_THEN "e" (MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN
3627 DISCH_THEN(MP_TAC o SPEC `d / &4`) THEN
3628 ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN
3629 DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
3630 ASM_MESON_TAC[ARITH_RULE `M + N <= (n:num) ==> M <= n /\ N <= n`];
3634 ==> abs((sum((N+1)..n) (\k. e k * (f (k + 1) - f k)) -
3637 <= d / &2 * f(n + 1)`
3639 [REPEAT STRIP_TAC THEN
3640 MP_TAC(ISPECL [`\k. (e k - c:real) * (f (k + 1) - f k)`;
3641 `\k. d / &4 * (f (k + 1) - f k)`;
3642 `(N+1)..n`] SUM_ABS_LE) THEN
3643 REWRITE_TAC[IN_NUMSEG; FINITE_NUMSEG] THEN ANTS_TAC THENL
3644 [REPEAT STRIP_TAC THEN
3645 ASM_SIMP_TAC[REAL_ABS_MUL; ARITH_RULE `N + 1 <= n ==> N <= n`;
3646 REAL_ARITH `a <= b ==> abs(b - a) = b - a`] THEN
3647 MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[REAL_SUB_LE] THEN
3648 ASM_SIMP_TAC[REAL_LT_IMP_LE; ARITH_RULE `N + 1 <= n ==> N <= n`];
3650 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [REAL_SUB_RDISTRIB] THEN
3651 REWRITE_TAC[SUM_SUB_NUMSEG] THEN
3652 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [SUM_PARTIAL_SUC] THEN
3653 GEN_REWRITE_TAC (LAND_CONV o LAND_CONV o RAND_CONV o RAND_CONV)
3654 [SUM_PARTIAL_SUC] THEN
3655 ASM_REWRITE_TAC[REAL_SUB_RZERO; REAL_SUB_REFL; REAL_MUL_RZERO; SUM_0] THEN
3656 MATCH_MP_TAC(REAL_ARITH
3657 `&0 <= d * f1 /\ &0 <= dd /\ abs(en - cn) <= d / &4 * f1
3658 ==> abs(s - (cn - cN)) <= d / &4 * f1 - dd
3659 ==> abs(s - en + cN) <= d / &2 * f1`) THEN
3660 REWRITE_TAC[REAL_ABS_MUL; GSYM REAL_SUB_RDISTRIB] THEN
3661 REPEAT CONJ_TAC THEN TRY(MATCH_MP_TAC REAL_LE_MUL) THEN
3662 ASM_SIMP_TAC[REAL_LE_MUL; REAL_LT_DIV; REAL_LT_IMP_LE; REAL_OF_NUM_LT;
3663 ARITH; LE_ADD; ARITH_RULE `N + 1 <= n ==> N <= n + 1`] THEN
3664 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[REAL_ABS_POS] THEN
3665 REWRITE_TAC[REAL_ARITH `abs x <= x <=> &0 <= x`] THEN
3666 ASM_SIMP_TAC[REAL_LT_IMP_LE; ARITH_RULE `N + 1 <= n ==> N <= n`;
3667 ARITH_RULE `N + 1 <= n ==> N <= n + 1`];
3669 DISCH_TAC THEN REWRITE_TAC[REAL_SUB_RZERO] THEN
3670 USE_THEN "g" (MP_TAC o MATCH_MP REALLIM_LMUL) THEN
3671 DISCH_THEN(MP_TAC o SPEC
3672 `sum(1..N) (\k. e k * (f (k + 1) - f k)) - c * f(N + 1)`) THEN
3673 DISCH_THEN(MP_TAC o SPEC `1` o MATCH_MP REAL_SEQ_OFFSET) THEN
3674 REWRITE_TAC[REAL_MUL_RZERO; tendsto_real; REAL_SUB_RZERO] THEN
3675 DISCH_THEN(MP_TAC o SPEC `d / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
3676 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MP) THEN
3677 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `N + 1` THEN
3678 X_GEN_TAC `n:num` THEN DISCH_TAC THEN
3679 FIRST_X_ASSUM(MP_TAC o C MATCH_MP (ASSUME `N + 1 <= n`)) THEN
3680 REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_DIV; REAL_ABS_INV] THEN
3681 ASM_SIMP_TAC[GSYM real_div; REAL_ARITH `&0 < x ==> abs x = x`;
3682 ARITH_RULE `N + 1 <= n ==> N <= n + 1`; REAL_LT_LDIV_EQ] THEN
3683 SUBGOAL_THEN `1 <= N + 1 /\ N <= n` MP_TAC THENL
3684 [ASM_ARITH_TAC; ALL_TAC] THEN
3685 DISCH_THEN(fun th -> REWRITE_TAC[GSYM(MATCH_MP SUM_COMBINE_R th)]) THEN
3688 let SUM_PARTIAL_LIMIT_ALT = prove
3690 (!k. M <= k ==> &0 < f k) /\
3691 (!k. M <= k ==> f(k) <= f(k + 1)) /\
3692 ((\k. inv(f k)) ---> &0) sequentially /\
3693 ((\n. f(n + 1) / f n) ---> b) sequentially /\
3694 (e ---> c) sequentially
3695 ==> ((\n. (sum(1..n) (\k. e(k) * (f(k + 1) - f(k))) - e(n) * f(n + 1)) /
3696 f(n)) ---> &0) sequentially`,
3697 REPEAT STRIP_TAC THEN
3698 MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN
3700 `\n. ((sum(1..n) (\k. e(k) * (f(k + 1) - f(k))) - e(n) * f(n + 1)) /
3701 f(n + 1)) * (f(n + 1) / f(n))` THEN
3702 REWRITE_TAC[] THEN CONJ_TAC THENL
3703 [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `M:num` THEN
3704 REPEAT STRIP_TAC THEN
3705 ASM_SIMP_TAC[REAL_FIELD `&0 < a /\ &0 < b ==> x / b * b / a = x / a`;
3706 ARITH_RULE `M <= n ==> M <= n + 1`];
3708 SUBST1_TAC(REAL_ARITH `&0 = &0 * b`) THEN
3709 MATCH_MP_TAC REALLIM_MUL THEN ASM_REWRITE_TAC[] THEN
3710 MATCH_MP_TAC SUM_PARTIAL_LIMIT THEN ASM_MESON_TAC[]);;
3712 let REALLIM_NA_OVER_N = prove
3713 (`!a. ((\n. (&n + a) / &n) ---> &1) sequentially`,
3714 GEN_TAC THEN REWRITE_TAC[real_div; REAL_ADD_RDISTRIB] THEN
3715 GEN_REWRITE_TAC LAND_CONV [GSYM REAL_ADD_RID] THEN
3716 MATCH_MP_TAC REALLIM_ADD THEN CONJ_TAC THENL
3717 [MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN
3718 EXISTS_TAC `\n:num. &1` THEN REWRITE_TAC[REALLIM_CONST] THEN
3719 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN
3720 REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN CONV_TAC REAL_FIELD;
3721 MATCH_MP_TAC REALLIM_NULL_LMUL THEN REWRITE_TAC[REALLIM_1_OVER_N]]);;
3723 let REALLIM_N_OVER_NA = prove
3724 (`!a. ((\n. &n / (&n + &1)) ---> &1) sequentially`,
3725 GEN_TAC THEN ONCE_REWRITE_TAC[GSYM REAL_INV_DIV] THEN
3726 GEN_REWRITE_TAC LAND_CONV [GSYM REAL_INV_1] THEN
3727 MATCH_MP_TAC REALLIM_INV THEN
3728 REWRITE_TAC[REALLIM_NA_OVER_N] THEN CONV_TAC REAL_RAT_REDUCE_CONV);;
3730 let REALLIM_LOG1_OVER_LOG = prove
3731 (`((\n. log(&n + &1) / log(&n)) ---> &1) sequentially`,
3732 MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN
3733 EXISTS_TAC `\n. &1 + log(&1 + &1 / &n) / log(&n)` THEN CONJ_TAC THENL
3734 [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `2` THEN
3735 REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN REPEAT STRIP_TAC THEN
3736 ASM_SIMP_TAC[LOG_POS_LT; REAL_ARITH `&2 <= x ==> &1 < x`;
3737 REAL_FIELD `&0 < x ==> (&1 + a / x = b / x <=> x + a = b)`] THEN
3738 ASM_SIMP_TAC[GSYM LOG_MUL; REAL_ARITH `&0 <= x ==> &0 < &1 + x`;
3739 REAL_LE_DIV; REAL_POS; REAL_ARITH `&2 <= x ==> &0 < x`] THEN
3740 AP_TERM_TAC THEN POP_ASSUM MP_TAC THEN CONV_TAC REAL_FIELD;
3742 GEN_REWRITE_TAC LAND_CONV [GSYM REAL_ADD_RID] THEN
3743 MATCH_MP_TAC REALLIM_ADD THEN REWRITE_TAC[REALLIM_CONST] THEN
3744 MATCH_MP_TAC REALLIM_TRANSFORM_BOUND THEN
3745 EXISTS_TAC `\n. inv(&n)` THEN REWRITE_TAC[REALLIM_1_OVER_N] THEN
3746 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `16` THEN
3747 X_GEN_TAC `n:num` THEN DISCH_TAC THEN
3748 REWRITE_TAC[real_div; REAL_ABS_MUL] THEN
3749 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
3750 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[REAL_ABS_POS] THEN
3752 [REWRITE_TAC[REAL_MUL_LID] THEN
3753 MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= y`) THEN
3754 ASM_SIMP_TAC[LOG_POS; REAL_LE_INV_EQ; REAL_POS;
3755 REAL_ARITH `&0 <= x ==> &1 <= &1 + x`] THEN
3756 MATCH_MP_TAC LOG_LE THEN REWRITE_TAC[REAL_LE_INV_EQ; REAL_POS];
3758 REWRITE_TAC[REAL_ABS_INV] THEN MATCH_MP_TAC REAL_INV_LE_1 THEN
3759 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&2 * log(&2)` THEN
3760 CONJ_TAC THENL [MP_TAC LOG_2_BOUNDS THEN REAL_ARITH_TAC; ALL_TAC] THEN
3761 SIMP_TAC[GSYM LOG_POW; REAL_OF_NUM_LT; ARITH] THEN
3762 MATCH_MP_TAC(REAL_ARITH `a <= b ==> a <= abs b`) THEN
3763 MATCH_MP_TAC LOG_MONO_LE_IMP THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
3764 REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC);;
3766 let REALLIM_LOG_OVER_LOG1 = prove
3767 (`((\n. log(&n) / log(&n + &1)) ---> &1) sequentially`,
3768 ONCE_REWRITE_TAC[GSYM REAL_INV_DIV] THEN
3769 GEN_REWRITE_TAC LAND_CONV [GSYM REAL_INV_1] THEN
3770 MATCH_MP_TAC REALLIM_INV THEN
3771 REWRITE_TAC[REALLIM_LOG1_OVER_LOG] THEN CONV_TAC REAL_RAT_REDUCE_CONV);;
3773 let ADHOC_BOUND_LEMMA = prove
3774 (`!k. 1 <= k ==> abs((&k + &1) * (log(&k + &1) - log(&k)) - &1)
3776 REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN
3777 GEN_TAC THEN DISCH_TAC THEN MP_TAC(ISPECL
3778 [`\n z. if n = 0 then clog z
3779 else if n = 1 then inv z
3780 else --inv(z pow 2)`;
3781 `Cx(&k + &1)`; `Cx(&k)`; `1`]
3782 COMPLEX_TAYLOR_MVT) THEN
3783 REWRITE_TAC[ARITH; ADD_EQ_0] THEN
3784 CONV_TAC(ONCE_DEPTH_CONV NUMSEG_CONV) THEN
3785 SIMP_TAC[VSUM_CLAUSES; FINITE_INSERT; FINITE_RULES] THEN
3786 REWRITE_TAC[IN_INSERT; NOT_IN_EMPTY; ARITH] THEN
3787 CONV_TAC NUM_REDUCE_CONV THEN
3788 REWRITE_TAC[COMPLEX_DIV_1; complex_pow; COMPLEX_POW_1; COMPLEX_VEC_0] THEN
3789 REWRITE_TAC[GSYM CX_SUB; COMPLEX_ADD_RID;
3790 REAL_ARITH `k - (k + &1) = -- &1`] THEN
3791 REWRITE_TAC[CX_SUB; CX_NEG; COMPLEX_MUL_LNEG; COMPLEX_MUL_RNEG;
3792 COMPLEX_NEG_NEG; COMPLEX_MUL_RID] THEN
3794 [MAP_EVERY X_GEN_TAC [`n:num`; `z:complex`] THEN
3795 REWRITE_TAC[ARITH_RULE `n <= 1 <=> n = 0 \/ n = 1`] THEN
3796 STRIP_TAC THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN REWRITE_TAC[ARITH] THEN
3797 COMPLEX_DIFF_TAC THEN
3798 REWRITE_TAC[COMPLEX_MUL_LID; complex_div; COMPLEX_MUL_LNEG] THEN
3799 REWRITE_TAC[COMPLEX_EQ; RE_CX; IM_CX] THEN
3800 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_SEGMENT_CX_GEN]) THEN
3801 POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
3803 DISCH_THEN(X_CHOOSE_THEN `z:complex`
3804 (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
3805 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_SEGMENT_CX_GEN]) THEN
3806 STRIP_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
3807 SUBGOAL_THEN `&0 < &k /\ &0 < &k + &1` STRIP_ASSUME_TAC THENL
3808 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN REWRITE_TAC[RE_ADD] THEN
3809 ONCE_REWRITE_TAC[REAL_RING `w:real = z + u <=> w - z = u`] THEN
3810 ASM_SIMP_TAC[GSYM CX_LOG; GSYM CX_INV; GSYM CX_ADD; GSYM CX_SUB;
3811 GSYM CX_NEG; RE_CX] THEN
3812 DISCH_THEN(MP_TAC o AP_TERM `(*) (&k + &1)`) THEN
3813 ASM_SIMP_TAC[REAL_FIELD
3814 `&0 < x ==> x * (y - (z + --inv x)) = &1 - x * (z - y)`] THEN
3815 ONCE_REWRITE_TAC[REAL_ABS_SUB] THEN DISCH_THEN SUBST1_TAC THEN
3816 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM real]) THEN
3817 REWRITE_TAC[REAL] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
3818 REWRITE_TAC[GSYM CX_SUB; GSYM CX_MUL; GSYM CX_POW; GSYM CX_INV; RE_CX] THEN
3819 REWRITE_TAC[REAL_POW_2; GSYM REAL_POW_INV; GSYM REAL_MUL_ASSOC] THEN
3820 ONCE_REWRITE_TAC[REAL_ARITH `a * b * c * d = (a * b:real) * (c * d)`] THEN
3821 REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[REAL_ABS_MUL] THEN
3822 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[REAL_ABS_POS] THEN
3823 SUBGOAL_THEN `&0 < Re z` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
3825 [ASM_SIMP_TAC[GSYM real_div; REAL_ABS_DIV; REAL_LE_LDIV_EQ;
3826 REAL_ARITH `&0 < x ==> abs x = x`] THEN
3829 REWRITE_TAC[REAL_ABS_MUL] THEN
3830 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
3831 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[REAL_ABS_POS] THEN
3832 CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
3833 REWRITE_TAC[REAL_ABS_INV] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
3834 ASM_REAL_ARITH_TAC);;
3836 let REALLIM_MUL_SERIES = prove
3838 eventually (\n. &0 < x n) sequentially /\
3839 eventually (\n. &0 < y n) sequentially /\
3840 eventually (\n. &0 < z n) sequentially /\
3841 ((\n. inv(z n)) ---> &0) sequentially /\
3842 eventually (\n. abs(sum (1..n) x / z(n)) <= B) sequentially /\
3843 ((\n. y(n) / x(n)) ---> &0) sequentially
3844 ==> ((\n. sum (1..n) y / z(n)) ---> &0) sequentially`,
3845 REWRITE_TAC[CONJ_ASSOC; GSYM EVENTUALLY_AND] THEN
3846 REWRITE_TAC[GSYM CONJ_ASSOC] THEN REPEAT STRIP_TAC THEN
3847 REWRITE_TAC[tendsto_real] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
3849 `eventually (\n. &0 < x n /\ &0 < y n /\ &0 < z n) sequentially`) THEN
3850 MP_TAC(ASSUME `((\n. y n / x n) ---> &0) sequentially`) THEN
3851 REWRITE_TAC[tendsto_real] THEN
3852 DISCH_THEN(MP_TAC o SPEC `e / (&2 * (&1 + abs B))`) THEN ANTS_TAC THENL
3853 [MATCH_MP_TAC REAL_LT_DIV THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
3854 REWRITE_TAC[REAL_HALF; IMP_IMP; GSYM EVENTUALLY_AND] THEN
3855 GEN_REWRITE_TAC LAND_CONV [EVENTUALLY_SEQUENTIALLY] THEN
3856 REWRITE_TAC[REAL_SUB_RZERO] THEN
3857 DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN
3858 MP_TAC(ASSUME `((\n. inv (z n)) ---> &0) sequentially`) THEN
3859 DISCH_THEN(MP_TAC o MATCH_MP REALLIM_LMUL) THEN
3860 DISCH_THEN(MP_TAC o SPEC
3861 `e / (&2 * (&1 + abs B)) * abs(sum(1..N) x) + abs(sum(1..N) y)`) THEN
3862 REWRITE_TAC[REAL_MUL_RZERO; tendsto_real; REAL_SUB_RZERO] THEN
3863 DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN ASM_REWRITE_TAC[REAL_HALF] THEN
3865 `eventually (\n. abs (sum (1..n) x / z n) <= B) sequentially`) THEN
3866 REWRITE_TAC[IMP_IMP; GSYM EVENTUALLY_AND] THEN
3867 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MP) THEN
3868 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN
3869 EXISTS_TAC `N + 1` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
3870 SUBGOAL_THEN `1 <= N + 1 /\ N <= n` MP_TAC THENL
3871 [ASM_ARITH_TAC; ALL_TAC] THEN
3872 DISCH_THEN(fun th -> REWRITE_TAC[GSYM(MATCH_MP SUM_COMBINE_R th)]) THEN
3873 REWRITE_TAC[real_div; REAL_ADD_RDISTRIB; REAL_SUB_RDISTRIB] THEN
3874 REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN REWRITE_TAC[GSYM real_div] THEN
3875 SUBGOAL_THEN `!x. abs(x) / z(n:num) = abs(x / z n)`
3876 (fun th -> REWRITE_TAC[th])
3878 [ASM_SIMP_TAC[REAL_ABS_DIV; REAL_ARITH `&0 < n ==> abs n = n`;
3879 ARITH_RULE `N + 1 <= n ==> N <= n`];
3881 REWRITE_TAC[REAL_MUL_ASSOC; GSYM real_div] THEN STRIP_TAC THEN
3882 MATCH_MP_TAC(REAL_ARITH
3883 `!y'. abs(y) <= y' /\ abs(x) + y' < e ==> abs(x + y) < e`) THEN
3884 EXISTS_TAC `e / (&2 * (&1 + abs B)) * sum(N+1..n) x / z n` THEN
3886 [REWRITE_TAC[real_div; GSYM SUM_LMUL; GSYM SUM_RMUL] THEN
3887 MATCH_MP_TAC SUM_ABS_LE THEN
3888 ASM_SIMP_TAC[FINITE_NUMSEG; IN_NUMSEG; REAL_ABS_MUL; REAL_ABS_INV;
3889 REAL_ARITH `&0 < n ==> abs n = n`;
3890 ARITH_RULE `N + 1 <= n ==> N <= n`;
3891 REAL_LE_RMUL_EQ; REAL_LT_INV_EQ; REAL_MUL_ASSOC;
3892 GSYM REAL_LE_LDIV_EQ] THEN
3893 REPEAT STRIP_TAC THEN
3894 MATCH_MP_TAC(REAL_ARITH `&0 < x /\ abs x < y ==> x <= y`) THEN
3895 ASM_SIMP_TAC[GSYM real_div; REAL_LT_DIV;
3896 ARITH_RULE `N + 1 <= n ==> N <= n`];
3898 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
3899 `abs(d * abs xN + abs yN) < e / &2
3900 ==> d * abs xN = abs(d * xN) /\ abs(d * xN + xn) <= e / &2
3901 ==> abs(yN) + xn < e`)) THEN
3902 REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_DIV; REAL_ABS_NUM;
3903 GSYM REAL_ADD_LDISTRIB; REAL_ABS_MUL] THEN
3904 ASM_SIMP_TAC[REAL_ARITH `&0 < n ==> abs n = n`;
3905 REAL_ARITH `abs(&1 + abs B) = &1 + abs B`] THEN
3906 REWRITE_TAC[real_div; REAL_INV_MUL] THEN
3907 ONCE_REWRITE_TAC[REAL_ARITH
3908 `(e * inv(&2) * i) * x = (e * inv(&2)) * x * i`] THEN
3909 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
3910 MATCH_MP_TAC REAL_LE_LMUL THEN
3911 SIMP_TAC[GSYM real_div; REAL_LE_LDIV_EQ; REAL_ARITH `&0 < &1 + abs B`] THEN
3912 ASM_REAL_ARITH_TAC);;
3914 let REALLIM_MUL_SERIES_LIM = prove
3916 eventually (\n. &0 < x n) sequentially /\
3917 eventually (\n. &0 < y n) sequentially /\
3918 eventually (\n. &0 < z n) sequentially /\
3919 ((\n. inv(z n)) ---> &0) sequentially /\
3920 ((\n. sum (1..n) x / z(n)) ---> l) sequentially /\
3921 ((\n. y(n) / x(n)) ---> &0) sequentially
3922 ==> ((\n. sum (1..n) y / z(n)) ---> &0) sequentially`,
3923 REPEAT STRIP_TAC THEN MATCH_MP_TAC REALLIM_MUL_SERIES THEN
3924 EXISTS_TAC `x:num->real` THEN
3925 MP_TAC(MATCH_MP REAL_CONVERGENT_IMP_BOUNDED
3926 (ASSUME `((\n. sum (1..n) x / z n) ---> l) sequentially`)) THEN
3927 REWRITE_TAC[real_bounded] THEN MATCH_MP_TAC MONO_EXISTS THEN
3928 ASM_SIMP_TAC[ALWAYS_EVENTUALLY; FORALL_IN_IMAGE; IN_UNIV]);;
3930 (* ------------------------------------------------------------------------- *)
3931 (* Finally, the Prime Number Theorem! *)
3932 (* ------------------------------------------------------------------------- *)
3935 (`((\n. &(CARD {p | prime p /\ p <= n}) / (&n / log(&n)))
3936 ---> &1) sequentially`,
3937 REWRITE_TAC[PNT_PARTIAL_SUMMATION] THEN
3938 REWRITE_TAC[SUM_PARTIAL_PRE] THEN
3939 REWRITE_TAC[GSYM REAL_OF_NUM_ADD; SUB_REFL; CONJUNCT1 LE] THEN
3940 SUBGOAL_THEN `{p | prime p /\ p = 0} = {}` SUBST1_TAC THENL
3941 [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN
3942 MESON_TAC[PRIME_IMP_NZ];
3944 REWRITE_TAC[SUM_CLAUSES; REAL_MUL_RZERO; REAL_SUB_RZERO] THEN
3945 MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN
3947 `\n. ((&n + &1) / log(&n + &1) *
3948 sum {p | prime p /\ p <= n} (\p. log(&p) / &p) -
3950 (\k. sum {p | prime p /\ p <= k} (\p. log(&p) / &p) *
3951 ((&k + &1) / log(&k + &1) - &k / log(&k)))) / (&n / log(&n))` THEN
3953 [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN SIMP_TAC[];
3955 MATCH_MP_TAC REALLIM_TRANSFORM THEN
3957 `\n. ((&n + &1) / log(&n + &1) * log(&n) -
3959 (\k. log(&k) * ((&k + &1) / log(&k + &1) - &k / log(&k)))) /
3960 (&n / log(&n))` THEN
3961 REWRITE_TAC[] THEN CONJ_TAC THENL
3962 [REWRITE_TAC[REAL_ARITH
3963 `(a * x - s) / b - (a * x' - s') / b:real =
3964 ((s' - s) - (x' - x) * a) / b`] THEN
3965 REWRITE_TAC[GSYM SUM_SUB_NUMSEG; GSYM REAL_SUB_RDISTRIB] THEN
3966 REWRITE_TAC[REAL_OF_NUM_ADD] THEN
3967 MATCH_MP_TAC SUM_PARTIAL_LIMIT_ALT THEN
3968 EXISTS_TAC `&1` THEN ONCE_REWRITE_TAC[SWAP_EXISTS_THM] THEN
3969 EXISTS_TAC `16` THEN REWRITE_TAC[RIGHT_EXISTS_AND_THM] THEN
3970 REWRITE_TAC[MERTENS_LIMIT] THEN REWRITE_TAC[REAL_INV_DIV] THEN
3971 SIMP_TAC[REAL_LT_DIV; LOG_POS_LT; REAL_OF_NUM_LT;
3972 ARITH_RULE `16 <= n ==> 0 < n /\ 1 < n`] THEN
3973 REWRITE_TAC[REALLIM_LOG_OVER_N] THEN CONJ_TAC THENL
3975 MP_TAC(CONJ REALLIM_LOG_OVER_LOG1 (SPEC `&1` REALLIM_NA_OVER_N)) THEN
3976 DISCH_THEN(MP_TAC o MATCH_MP REALLIM_MUL) THEN
3977 REWRITE_TAC[REAL_MUL_LID] THEN
3978 REWRITE_TAC[GSYM REAL_OF_NUM_ADD; GSYM REAL_ADD_ASSOC] THEN
3979 CONV_TAC REAL_RAT_REDUCE_CONV THEN MATCH_MP_TAC EQ_IMP THEN
3980 AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
3981 REWRITE_TAC[FUN_EQ_THM; real_div; REAL_INV_MUL; REAL_INV_INV] THEN
3982 REWRITE_TAC[REAL_MUL_AC]] THEN
3983 X_GEN_TAC `n:num` THEN DISCH_TAC THEN
3984 MP_TAC(SPECL [`\z. z / clog z`; `\z. inv(clog z) - inv(clog z) pow 2`;
3985 `Cx(&n)`; `Cx(&n + &1)`]
3986 COMPLEX_MVT_LINE) THEN
3987 REWRITE_TAC[IN_SEGMENT_CX_GEN] THEN
3988 REWRITE_TAC[REAL_ARITH `~(n + &1 <= x /\ x <= n)`] THEN ANTS_TAC THENL
3989 [X_GEN_TAC `z:complex` THEN STRIP_TAC THEN COMPLEX_DIFF_TAC THEN
3990 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
3991 REWRITE_TAC[GSYM CONJ_ASSOC] THEN
3992 CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
3993 MATCH_MP_TAC(TAUT `(a ==> b) /\ a ==> a /\ b`) THEN CONJ_TAC THENL
3994 [SUBGOAL_THEN `~(z = Cx(&0))` MP_TAC THENL
3995 [ALL_TAC; CONV_TAC COMPLEX_FIELD] THEN
3996 REWRITE_TAC[COMPLEX_EQ; RE_CX; IM_CX] THEN ASM_REAL_ARITH_TAC;
3998 SUBGOAL_THEN `&0 < Re z` ASSUME_TAC THENL
3999 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
4000 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM real]) THEN
4001 REWRITE_TAC[REAL] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
4002 ASM_SIMP_TAC[GSYM CX_LOG; REAL_ARITH `&16 <= x ==> &0 < x`] THEN
4003 REWRITE_TAC[CX_INJ] THEN MATCH_MP_TAC REAL_LT_IMP_NZ THEN
4004 MATCH_MP_TAC LOG_POS_LT THEN ASM_REAL_ARITH_TAC;
4006 DISCH_THEN(X_CHOOSE_THEN `z:complex`
4007 (CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC)) THEN
4008 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM real]) THEN
4009 REWRITE_TAC[REAL] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
4010 SUBGOAL_THEN `&0 < Re z /\ &0 < &n /\ &0 < &n + &1` STRIP_ASSUME_TAC THENL
4011 [RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
4014 ASM_SIMP_TAC[GSYM CX_LOG; GSYM CX_POW; GSYM CX_INV; GSYM CX_SUB;
4015 GSYM CX_DIV; RE_CX; GSYM CX_MUL] THEN
4016 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_SUB_LE] THEN
4017 REWRITE_TAC[GSYM REAL_OF_NUM_ADD; REAL_ADD_SUB; REAL_MUL_RID] THEN
4018 DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[REAL_SUB_LE] THEN
4019 REWRITE_TAC[REAL_ARITH `x pow 2 <= x <=> x * x <= x * &1`] THEN
4020 MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL
4021 [REWRITE_TAC[REAL_LE_INV_EQ] THEN MATCH_MP_TAC LOG_POS THEN
4022 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
4025 MATCH_MP_TAC REAL_INV_LE_1 THEN
4026 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&4 * log(&2)` THEN
4027 CONJ_TAC THENL [MP_TAC LOG_2_BOUNDS THEN REAL_ARITH_TAC; ALL_TAC] THEN
4028 SIMP_TAC[GSYM LOG_POW; REAL_OF_NUM_LT; ARITH] THEN
4029 MATCH_MP_TAC LOG_MONO_LE_IMP THEN
4030 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN ASM_REAL_ARITH_TAC;
4032 REWRITE_TAC[REAL_OF_NUM_ADD] THEN ONCE_REWRITE_TAC[SUM_PARTIAL_SUC] THEN
4033 MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN
4035 `\n. ((&n + &1) / log(&n + &1) * (log(&n) - log(&n + &1)) +
4036 sum(1..n) (\k. (&k + &1) / log(&k + &1) *
4037 (log(&k + &1) - log(&k)))) / (&n / log(&n))` THEN
4039 [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN
4040 SIMP_TAC[REAL_OF_NUM_ADD; LOG_1; REAL_MUL_LZERO; REAL_SUB_RZERO] THEN
4043 MATCH_MP_TAC REAL_SEQ_OFFSET_REV THEN EXISTS_TAC `1` THEN
4044 REWRITE_TAC[GSYM ADD1; SUM_CLAUSES_NUMSEG; ARITH_RULE `1 <= SUC i`] THEN
4045 REWRITE_TAC[GSYM REAL_OF_NUM_SUC; GSYM REAL_OF_NUM_ADD] THEN
4046 REWRITE_TAC[REAL_ARITH `a * (x - y) + s + a * (y - x):real = s`] THEN
4047 MATCH_MP_TAC REALLIM_TRANSFORM THEN
4049 `\n. sum(1..n) (\k. &1 / log(&k + &1) - &1 / log(&k + &1) pow 2) /
4050 ((&n + &1) / log(&n + &1))` THEN
4052 MATCH_MP_TAC(TAUT `b /\ (b ==> a) ==> a /\ b`) THEN CONJ_TAC THENL
4053 [MATCH_MP_TAC REALLIM_TRANSFORM_STRADDLE THEN
4054 EXISTS_TAC `\n. ((&n + &2) / log (&n + &2) +
4055 (sum(1..15) (\k. &1 / log(&k + &1) - &1 / log(&k + &1) pow 2) -
4056 &17 / log (&17))) / ((&n + &1) / log (&n + &1))` THEN
4057 EXISTS_TAC `\n. ((&n + &1) / log(&n + &1) +
4058 (sum(1..15) (\k. &1 / log(&k + &1) - &1 / log(&k + &1) pow 2) -
4059 &16 / log (&16))) / ((&n + &1) / log (&n + &1))` THEN
4060 MP_TAC(GEN `n:num` (ISPECL
4061 [`\z. Cx(&1) / clog(z + Cx(&1)) - Cx(&1) / (clog(z + Cx(&1))) pow 2`;
4062 `\z. (z + Cx(&1)) / clog(z + Cx(&1))`;
4064 SUM_INTEGRAL_BOUNDS_DECREASING)) THEN
4065 MATCH_MP_TAC(MESON[]
4066 `(!n. P n ==> Q n) /\ ((!n. P n ==> R n) ==> s)
4067 ==> (!n. P n /\ Q n ==> R n) ==> s`) THEN
4068 ASM_REWRITE_TAC[] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN CONJ_TAC THENL
4069 [X_GEN_TAC `n:num` THEN DISCH_TAC THEN CONJ_TAC THENL
4070 [X_GEN_TAC `z:complex` THEN REWRITE_TAC[IN_SEGMENT_CX_GEN] THEN
4071 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
4072 STRIP_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN
4073 COMPLEX_DIFF_TAC THEN
4074 REWRITE_TAC[RE_ADD; RE_CX; GSYM CONJ_ASSOC] THEN
4075 CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
4076 MATCH_MP_TAC(TAUT `(a ==> b) /\ a ==> a /\ b`) THEN CONJ_TAC THENL
4077 [SUBGOAL_THEN `~(z + Cx(&1) = Cx(&0))` MP_TAC THENL
4078 [ALL_TAC; CONV_TAC COMPLEX_FIELD] THEN
4079 DISCH_THEN(MP_TAC o AP_TERM `Re`) THEN SIMP_TAC[RE_ADD; RE_CX] THEN
4082 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM real]) THEN
4083 REWRITE_TAC[REAL] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN
4084 ASM_SIMP_TAC[GSYM CX_ADD; GSYM CX_LOG; RE_CX; REAL_CX;
4085 REAL_ARITH `&15 <= z ==> &0 < z + &1`; CX_INJ] THEN
4086 MATCH_MP_TAC REAL_LT_IMP_NZ THEN MATCH_MP_TAC LOG_POS_LT THEN
4089 MAP_EVERY X_GEN_TAC [`x:real`; `y:real`] THEN STRIP_TAC THEN
4090 SUBGOAL_THEN `&15 <= y` ASSUME_TAC THENL
4091 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
4092 ASM_SIMP_TAC[GSYM CX_ADD; GSYM CX_LOG; RE_CX;
4093 REAL_ARITH `&15 <= x ==> &0 < x + &1`] THEN
4094 REWRITE_TAC[GSYM CX_DIV; GSYM CX_SUB; RE_CX; GSYM CX_POW] THEN
4095 REWRITE_TAC[real_div; REAL_MUL_LID; GSYM REAL_POW_INV] THEN
4096 REWRITE_TAC[REAL_ARITH
4097 `x - x pow 2 <= y - y pow 2 <=>
4098 (x + y) * (y - x) <= &1 * (y - x)`] THEN
4099 MATCH_MP_TAC REAL_LE_RMUL THEN
4100 MATCH_MP_TAC(REAL_ARITH
4101 `x <= inv(&2) /\ y <= x
4102 ==> y + x <= &1 /\ &0 <= x - y`) THEN
4103 CONJ_TAC THEN MATCH_MP_TAC REAL_LE_INV2 THEN
4104 CONV_TAC REAL_RAT_REDUCE_CONV THENL
4105 [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&4 * log(&2)` THEN
4106 CONJ_TAC THENL [MP_TAC LOG_2_BOUNDS THEN REAL_ARITH_TAC; ALL_TAC] THEN
4107 SIMP_TAC[GSYM LOG_POW; REAL_OF_NUM_LT; ARITH] THEN
4108 MATCH_MP_TAC LOG_MONO_LE_IMP THEN ASM_REAL_ARITH_TAC;
4111 [MATCH_MP_TAC LOG_POS_LT THEN ASM_REAL_ARITH_TAC;
4112 MATCH_MP_TAC LOG_MONO_LE_IMP THEN ASM_REAL_ARITH_TAC];
4114 REPEAT STRIP_TAC THENL
4115 [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `16` THEN
4116 X_GEN_TAC `n:num` THEN STRIP_TAC THEN REWRITE_TAC[real_div] THEN
4117 MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL
4118 [REWRITE_TAC[GSYM real_div];
4119 REWRITE_TAC[REAL_LE_INV_EQ] THEN MATCH_MP_TAC REAL_LE_MUL THEN
4120 REWRITE_TAC[REAL_LE_INV_EQ] THEN
4121 CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN
4122 MATCH_MP_TAC LOG_POS THEN REAL_ARITH_TAC] THEN
4123 SUBGOAL_THEN `1 <= 15 + 1 /\ 15 <= n` MP_TAC THENL
4124 [ASM_ARITH_TAC; ALL_TAC] THEN
4125 DISCH_THEN(fun th ->
4126 REWRITE_TAC[GSYM(MATCH_MP SUM_COMBINE_R th)]) THEN
4127 FIRST_ASSUM(MP_TAC o CONJUNCT1 o C MATCH_MP (ASSUME `16 <= n`)) THEN
4128 REWRITE_TAC[GSYM CX_ADD; REAL_ARITH `(n + &1) + &1 = n + &2`] THEN
4129 CONV_TAC REAL_RAT_REDUCE_CONV THEN
4130 ASM_SIMP_TAC[GSYM CX_LOG; REAL_OF_NUM_LT; ARITH;
4131 REAL_ARITH `&0 < &n + &1 /\ &0 < &n + &2`] THEN
4132 REWRITE_TAC[GSYM CX_POW; GSYM CX_DIV; GSYM CX_SUB; RE_CX] THEN
4134 REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[REAL_ADD_RDISTRIB] THEN
4135 GEN_REWRITE_TAC LAND_CONV [GSYM REAL_ADD_RID] THEN
4136 MATCH_MP_TAC REALLIM_ADD THEN CONJ_TAC THENL
4137 [MP_TAC(CONJ REALLIM_LOG_OVER_LOG1 (SPEC `&1` REALLIM_NA_OVER_N)) THEN
4138 DISCH_THEN(MP_TAC o MATCH_MP REALLIM_MUL) THEN
4139 REWRITE_TAC[REAL_MUL_LID] THEN
4140 DISCH_THEN(MP_TAC o SPEC `1` o MATCH_MP REAL_SEQ_OFFSET) THEN
4141 REWRITE_TAC[GSYM REAL_OF_NUM_ADD; GSYM REAL_ADD_ASSOC] THEN
4142 CONV_TAC REAL_RAT_REDUCE_CONV THEN MATCH_MP_TAC EQ_IMP THEN
4143 AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
4144 REWRITE_TAC[FUN_EQ_THM; real_div; REAL_INV_MUL; REAL_INV_INV] THEN
4145 REWRITE_TAC[REAL_MUL_AC];
4147 MATCH_MP_TAC REALLIM_NULL_LMUL THEN
4148 REWRITE_TAC[GSYM real_div; REAL_INV_DIV] THEN
4149 MP_TAC(SPEC `1` (MATCH_MP REAL_SEQ_OFFSET REALLIM_LOG_OVER_N)) THEN
4150 REWRITE_TAC[GSYM REAL_OF_NUM_ADD];
4151 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `16` THEN
4152 X_GEN_TAC `n:num` THEN STRIP_TAC THEN REWRITE_TAC[real_div] THEN
4153 MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL
4154 [REWRITE_TAC[GSYM real_div];
4155 REWRITE_TAC[REAL_LE_INV_EQ] THEN MATCH_MP_TAC REAL_LE_MUL THEN
4156 REWRITE_TAC[REAL_LE_INV_EQ] THEN
4157 CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN
4158 MATCH_MP_TAC LOG_POS THEN REAL_ARITH_TAC] THEN
4159 SUBGOAL_THEN `1 <= 15 + 1 /\ 15 <= n` MP_TAC THENL
4160 [ASM_ARITH_TAC; ALL_TAC] THEN
4161 DISCH_THEN(fun th ->
4162 REWRITE_TAC[GSYM(MATCH_MP SUM_COMBINE_R th)]) THEN
4163 FIRST_ASSUM(MP_TAC o CONJUNCT2 o C MATCH_MP (ASSUME `16 <= n`)) THEN
4164 REWRITE_TAC[GSYM CX_ADD; REAL_ARITH `(n + &1) + &1 = n + &2`] THEN
4165 CONV_TAC REAL_RAT_REDUCE_CONV THEN
4166 ASM_SIMP_TAC[GSYM CX_LOG; REAL_OF_NUM_LT; ARITH;
4167 REAL_ARITH `&0 < &n + &1 /\ &0 < &n + &2`] THEN
4168 REWRITE_TAC[GSYM CX_POW; GSYM CX_DIV; GSYM CX_SUB; RE_CX] THEN
4170 REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[REAL_ADD_RDISTRIB] THEN
4171 GEN_REWRITE_TAC LAND_CONV [GSYM REAL_ADD_RID] THEN
4172 MATCH_MP_TAC REALLIM_ADD THEN CONJ_TAC THENL
4173 [MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN
4174 EXISTS_TAC `\n:num. &1` THEN REWRITE_TAC[REALLIM_CONST] THEN
4175 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN
4176 REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN X_GEN_TAC `n:num` THEN
4177 REPEAT STRIP_TAC THEN
4178 SUBGOAL_THEN `&0 < log(&n + &1)` ASSUME_TAC THENL
4179 [ALL_TAC; POP_ASSUM MP_TAC THEN CONV_TAC REAL_FIELD] THEN
4180 MATCH_MP_TAC LOG_POS_LT THEN POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
4182 MATCH_MP_TAC REALLIM_NULL_LMUL THEN
4183 REWRITE_TAC[GSYM real_div; REAL_INV_DIV] THEN
4184 MP_TAC(SPEC `1` (MATCH_MP REAL_SEQ_OFFSET REALLIM_LOG_OVER_N)) THEN
4185 REWRITE_TAC[GSYM REAL_OF_NUM_ADD]];
4188 REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[GSYM REAL_SUB_RDISTRIB] THEN
4189 REWRITE_TAC[GSYM real_div] THEN REWRITE_TAC[GSYM SUM_SUB_NUMSEG] THEN
4190 MATCH_MP_TAC REALLIM_TRANSFORM_BOUND THEN
4191 EXISTS_TAC `\n. sum(1..n) (\k. &1 / log(&k + &1) pow 2 +
4192 &2 / (&k * log(&k + &1))) /
4193 ((&n + &1) / log(&n + &1))` THEN
4194 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN CONJ_TAC THENL
4195 [EXISTS_TAC `1` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
4196 REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[REAL_ABS_MUL] THEN
4197 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[REAL_ABS_POS] THEN
4198 REWRITE_TAC[GSYM real_div] THEN CONJ_TAC THENL
4200 REWRITE_TAC[REAL_INV_DIV; REAL_ARITH `abs x <= x <=> &0 <= x`] THEN
4201 MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL
4202 [MATCH_MP_TAC LOG_POS; ALL_TAC] THEN
4203 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
4204 ASM_REAL_ARITH_TAC] THEN
4205 MATCH_MP_TAC SUM_ABS_LE THEN REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN
4206 X_GEN_TAC `m:num` THEN STRIP_TAC THEN
4207 MATCH_MP_TAC(REAL_ARITH
4208 `&0 <= x /\ abs(a - b) <= y ==> abs(a - x - b) <= x + y`) THEN
4210 [REWRITE_TAC[real_div; REAL_MUL_LID; REAL_LE_INV_EQ] THEN
4211 MATCH_MP_TAC REAL_POW_LE THEN MATCH_MP_TAC LOG_POS THEN
4212 REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC;
4214 REWRITE_TAC[REAL_ARITH
4215 `&1 / l - m1 / l * x:real = --((m1 * x - &1) / l)`] THEN
4216 REWRITE_TAC[REAL_ABS_NEG; REAL_ABS_MUL; real_div; REAL_INV_MUL] THEN
4217 REWRITE_TAC[REAL_MUL_ASSOC] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
4218 REWRITE_TAC[REAL_ABS_POS] THEN
4219 ASM_SIMP_TAC[GSYM real_div; ADHOC_BOUND_LEMMA] THEN
4220 REWRITE_TAC[REAL_ARITH `abs x <= x <=> &0 <= x`; REAL_LE_INV_EQ] THEN
4221 MATCH_MP_TAC LOG_POS THEN
4222 REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC;
4224 MATCH_MP_TAC REALLIM_TRANSFORM_BOUND THEN
4225 EXISTS_TAC `\n. sum(1..n) (\k. &3 / log(&k + &1) pow 2) /
4226 ((&n + &1) / log(&n + &1))` THEN
4227 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN CONJ_TAC THENL
4228 [EXISTS_TAC `1` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
4229 REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[REAL_ABS_MUL] THEN
4230 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[REAL_ABS_POS] THEN
4231 REWRITE_TAC[GSYM real_div] THEN CONJ_TAC THENL
4233 REWRITE_TAC[REAL_INV_DIV; REAL_ARITH `abs x <= x <=> &0 <= x`] THEN
4234 MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL
4235 [MATCH_MP_TAC LOG_POS; ALL_TAC] THEN
4236 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
4237 ASM_REAL_ARITH_TAC] THEN
4238 MATCH_MP_TAC SUM_ABS_LE THEN REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN
4239 X_GEN_TAC `m:num` THEN STRIP_TAC THEN REWRITE_TAC[real_div] THEN
4240 MATCH_MP_TAC(REAL_ARITH
4242 ==> abs(&1 * x + &2 * y) <= &3 * x`) THEN
4243 SUBGOAL_THEN `&0 < log(&m + &1)` ASSUME_TAC THENL
4244 [MATCH_MP_TAC LOG_POS_LT THEN
4245 REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_LT] THEN ASM_ARITH_TAC;
4247 ASM_SIMP_TAC[REAL_LE_INV_EQ; REAL_LE_MUL; REAL_POS; REAL_LT_IMP_LE] THEN
4248 REWRITE_TAC[REAL_POW_2; REAL_INV_MUL] THEN
4249 MATCH_MP_TAC REAL_LE_RMUL THEN
4250 ASM_SIMP_TAC[REAL_LE_INV_EQ; REAL_LT_IMP_LE] THEN
4251 MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REWRITE_TAC[] THEN
4252 ONCE_REWRITE_TAC[REAL_ADD_SYM] THEN MATCH_MP_TAC LOG_LE THEN
4253 REWRITE_TAC[REAL_POS];
4255 REWRITE_TAC[real_div; SUM_LMUL; GSYM REAL_MUL_ASSOC] THEN
4256 MATCH_MP_TAC REALLIM_NULL_LMUL THEN REWRITE_TAC[GSYM real_div] THEN
4257 MATCH_MP_TAC REALLIM_MUL_SERIES_LIM THEN
4258 MAP_EVERY EXISTS_TAC
4259 [`\n. &1 / log(&n + &1) - &1 / log(&n + &1) pow 2`; `&1`] THEN
4260 ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL
4261 [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `16` THEN
4262 REPEAT STRIP_TAC THEN REWRITE_TAC[real_div; REAL_MUL_LID; REAL_SUB_LT] THEN
4263 MATCH_MP_TAC REAL_LT_INV2 THEN
4264 SUBGOAL_THEN `&1 < log(&n + &1)`
4265 (fun th -> SIMP_TAC[th; REAL_ARITH `&1 < x ==> &0 < x`; REAL_SUB_LT;
4266 REAL_LT_MUL; REAL_ARITH `x < x pow 2 <=> &0 < x * (x - &1)`]) THEN
4267 MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `&4 * log(&2)` THEN
4268 CONJ_TAC THENL [MP_TAC LOG_2_BOUNDS THEN REAL_ARITH_TAC; ALL_TAC] THEN
4269 SIMP_TAC[GSYM LOG_POW; REAL_OF_NUM_LT; ARITH] THEN
4270 MATCH_MP_TAC LOG_MONO_LT_IMP THEN
4271 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
4273 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN
4274 SIMP_TAC[REAL_LT_INV_EQ; LOG_POS_LT; REAL_POW_LT;
4275 REAL_ARITH `&1 <= x ==> &1 < x + &1`; REAL_OF_NUM_LE];
4276 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN
4277 SIMP_TAC[REAL_LT_INV_EQ; LOG_POS_LT; REAL_POW_LT;
4278 REAL_ARITH `&1 <= x ==> &1 < x + &1`; REAL_OF_NUM_LE;
4279 REAL_LT_DIV; REAL_ARITH `&0 < &n + &1`];
4280 MP_TAC(SPEC `1` (MATCH_MP REAL_SEQ_OFFSET REALLIM_LOG_OVER_N)) THEN
4281 REWRITE_TAC[REAL_INV_DIV; GSYM REAL_OF_NUM_ADD];
4283 MATCH_MP_TAC REALLIM_TRANSFORM_BOUND THEN
4284 EXISTS_TAC `\n. &2 / log(&n + &1)` THEN CONJ_TAC THENL
4286 REWRITE_TAC[real_div] THEN MATCH_MP_TAC REALLIM_NULL_LMUL THEN
4287 MP_TAC(SPEC `1` (MATCH_MP REAL_SEQ_OFFSET REALLIM_1_OVER_LOG)) THEN
4288 REWRITE_TAC[GSYM REAL_OF_NUM_ADD]] THEN
4289 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `42` THEN
4290 X_GEN_TAC `n:num` THEN DISCH_TAC THEN
4291 SUBGOAL_THEN `&2 < log(&n + &1)` ASSUME_TAC THENL
4292 [MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `&4 * log(&2)` THEN
4293 CONJ_TAC THENL [MP_TAC LOG_2_BOUNDS THEN REAL_ARITH_TAC; ALL_TAC] THEN
4294 SIMP_TAC[GSYM LOG_POW; REAL_OF_NUM_LT; ARITH] THEN
4295 MATCH_MP_TAC LOG_MONO_LT_IMP THEN
4296 RULE_ASSUM_TAC(REWRITE_RULE[GSYM REAL_OF_NUM_LE]) THEN
4299 ASM_SIMP_TAC[REAL_ABS_DIV; REAL_ABS_INV; REAL_ABS_POW;
4300 REAL_ARITH `&2 < x ==> abs x = x`] THEN
4301 REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
4302 ASM_SIMP_TAC[GSYM real_div; REAL_LE_LDIV_EQ; REAL_POW_LT;
4303 REAL_ARITH `&2 < x ==> &0 < x`] THEN
4304 ASM_SIMP_TAC[REAL_FIELD
4305 `&2 < l ==> (inv(l) * &2) * l pow 2 = inv(inv(&2 * l))`] THEN
4306 MATCH_MP_TAC REAL_LE_INV2 THEN REWRITE_TAC[REAL_LT_INV_EQ] THEN
4307 CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
4308 REWRITE_TAC[REAL_INV_MUL; real_div; GSYM REAL_POW_INV; REAL_MUL_LID] THEN
4309 MATCH_MP_TAC(REAL_ARITH
4311 ==> inv(&2) * l <= abs(l - l pow 2)`) THEN
4312 REWRITE_TAC[REAL_ARITH `l pow 2 <= l / &2 <=> &0 <= (&1 / &2 - l) * l`] THEN
4313 MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_LE_INV_EQ] THEN
4314 ASM_SIMP_TAC[real_div; REAL_MUL_LID; REAL_SUB_LE;
4315 ARITH_RULE `&2 < x ==> &0 <= x`] THEN
4316 MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REAL_ARITH_TAC);;