Update from HH
[hl193./.git] / 100 / pnt.ml
1 (* ========================================================================= *)
2 (* "Second proof" of Prime Number Theorem from Newman's book.                *)
3 (* ========================================================================= *)
4
5 needs "Multivariate/cauchy.ml";;
6 needs "Library/pocklington.ml";;
7 needs "Examples/mangoldt.ml";;
8
9 prioritize_real();;
10 prioritize_complex();;
11
12 (* ------------------------------------------------------------------------- *)
13 (* A few miscelleneous lemmas.                                               *)
14 (* ------------------------------------------------------------------------- *)
15
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`]);;
23
24 let CPOW_NUM_NE_1 = prove
25  (`!n s. &0 < Re s /\ 2 <= n ==> ~(Cx(&n) cpow s = Cx(&1))`,
26   REPEAT STRIP_TAC THEN
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;
29                REAL_LT_IMP_NE]);;
30
31 let FINITE_ATMOST = prove
32  (`!P n. FINITE {m:num | P m /\ m <= n}`,
33   REPEAT GEN_TAC THEN
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]);;
36
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);;
42
43 (* ------------------------------------------------------------------------- *)
44 (* An auxiliary zeta function that's analytic in the right halfplane.        *)
45 (* ------------------------------------------------------------------------- *)
46
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))))`;;
52
53 (* ------------------------------------------------------------------------- *)
54 (* The actual zeta function, with analyticity of z_n(s) - 1/(s - 1)^{n-1}    *)
55 (* ------------------------------------------------------------------------- *)
56
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))) /
60                      (s - Cx(&1))`;;
61
62 let zeta = new_definition
63  `zeta s = genzeta 1 s`;;
64
65 (* ------------------------------------------------------------------------- *)
66 (* Lemmas about convergence and analyticity of the series.                   *)
67 (* ------------------------------------------------------------------------- *)
68
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
89        ASM_ARITH_TAC;
90        ALL_TAC] 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];
93        ALL_TAC])
94     THENL
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;
103       ALL_TAC] THEN
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];
113       ALL_TAC] THEN
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;
123     ALL_TAC] THEN
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);;
136
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
142   CONJ_TAC THENL
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]);;
148
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]);;
156
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];
168     ALL_TAC] THEN
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;
177     ALL_TAC] THEN
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
180   ASM_ARITH_TAC);;
181
182 let ZETADIFF_CONVERGES = prove
183  (`!n s. &0 < Re(s)
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];
197     ALL_TAC] THEN
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`];
208     ALL_TAC] THEN
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;
217     ALL_TAC] THEN
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
232   ASM_ARITH_TAC);;
233
234 let NEARZETA_CONVERGES_LEMMA = prove
235  (`!n s. &1 <= Re s
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
243   CONJ_TAC THENL
244    [ALL_TAC;
245     EXISTS_TAC `1` THEN
246     ASM_SIMP_TAC[IN_FROM; GE; LE_1; NEARZETA_BOUND_LEMMA;
247                  REAL_ARITH `&1 <= s ==> &0 <= s + &1`]] THEN
248   SUBGOAL_THEN
249    `summable (from n)
250      (\m. lift(((Cx (norm s) * Cx (norm (s - Cx (&1)))) *
251                 Cx (&1) / Cx (&m) cpow Cx (Re s + &1))$1))`
252   MP_TAC THENL
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;
257     ALL_TAC] THEN
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;
266                LE_1] THEN
267   REWRITE_TAC[GSYM CX_INV; RE_CX; RE_ADD]);;
268
269 let GENZETA_CONVERGES = prove
270  (`!n s. &1 < Re s
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;
277     ALL_TAC] THEN
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
280   COND_CASES_TAC THENL
281    [UNDISCH_TAC `&1 < Re s` THEN ASM_REWRITE_TAC[RE_CX] THEN REAL_ARITH_TAC;
282     ALL_TAC] THEN
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;
288     ALL_TAC] THEN
289   ASM_SIMP_TAC[complex_div; COMPLEX_MUL_ASSOC; COMPLEX_MUL_LINV] THEN
290   REWRITE_TAC[COMPLEX_MUL_AC; COMPLEX_ADD_AC]);;
291
292 let ZETA_CONVERGES = prove
293  (`!s. &1 < Re s
294        ==> ((\n. Cx(&1) / Cx(&n) cpow s) sums zeta(s)) (from 1)`,
295   REWRITE_TAC[zeta; GENZETA_CONVERGES]);;
296
297 (* ------------------------------------------------------------------------- *)
298 (* We need the series for the derivative at one stage, so do this now.       *)
299 (* ------------------------------------------------------------------------- *)
300
301 let COMPLEX_DERIVATIVE_ZETA_CONVERGES = prove
302  (`!s. &1 < Re s
303        ==> ((\n. --clog(Cx(&n)) / Cx(&n) cpow s) sums
304             complex_derivative zeta s) (from 1)`,
305   REPEAT STRIP_TAC THEN
306   MP_TAC(ISPECL
307    [`\n z. Cx(&1) / Cx(&n) cpow z`;
308     `\n z. --clog(Cx(&n)) / Cx(&n) cpow z`;
309     `{s | Re s > &1}`;
310     `from 1`]
311    SERIES_AND_DERIVATIVE_COMPARISON_COMPLEX) THEN
312   REWRITE_TAC[OPEN_HALFSPACE_RE_GT; IN_ELIM_THM] THEN ANTS_TAC THENL
313    [CONJ_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];
318       ALL_TAC] THEN
319     POP_ASSUM(K ALL_TAC) THEN
320     X_GEN_TAC `z:complex` THEN REWRITE_TAC[real_gt] THEN STRIP_TAC THEN
321     MAP_EVERY EXISTS_TAC
322      [`(Re z - &1) / &2`;
323       `\n. Cx(&1) / Cx(&n) cpow (Cx(&1 + (Re z - &1) / &2))`;
324       `42`] THEN
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
328       MESON_TAC[summable];
329       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;
341     ALL_TAC] THEN
342   REWRITE_TAC[LEFT_IMP_EXISTS_THM; real_gt] THEN
343   MAP_EVERY X_GEN_TAC [`f:complex->complex`; `g:complex->complex`] THEN
344   DISCH_TAC 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);;
359
360 (* ------------------------------------------------------------------------- *)
361 (* The zeta function is actually analytic on a larger set.                   *)
362 (* ------------------------------------------------------------------------- *)
363
364 let HOLOMORPHIC_NEARZETA_LEMMA = prove
365  (`!n. 1 <= n
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))) /
372                                  Cx(&m) cpow s -
373                                  (clog(Cx(&(m + 1))) /
374                                   Cx(&(m + 1)) cpow (s - Cx(&1)) -
375                                   clog(Cx(&m)) /
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;
387     ALL_TAC] THEN
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];
398     ALL_TAC] THEN
399   CONJ_TAC THEN X_GEN_TAC `m:num` THEN REWRITE_TAC[from; IN_ELIM_THM] THENL
400    [DISCH_TAC THEN
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;
406     ALL_TAC] THEN
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
409   ANTS_TAC THENL
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;
413     ALL_TAC] THEN
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;
425     ALL_TAC] THEN
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);;
433
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))) /
441                     Cx(&m) cpow s -
442                     (clog(Cx(&(m + 1))) /
443                      Cx(&(m + 1)) cpow (s - Cx(&1)) -
444                      clog(Cx(&m)) /
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
455   STRIP_TAC THEN
456   SUBGOAL_THEN
457    `!s. &0 < Re s
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)`
462   ASSUME_TAC THENL
463    [REPEAT STRIP_TAC THEN REWRITE_TAC[nearzeta; SUMS_INFSUM] THEN
464     ASM_MESON_TAC[summable];
465     ALL_TAC] THEN
466   SUBGOAL_THEN `!z. &0 < Re z ==> nearzeta n z = g z` ASSUME_TAC THENL
467    [ASM_MESON_TAC[SERIES_UNIQUE]; ALL_TAC] THEN
468   ASM_SIMP_TAC[] THEN
469   SUBGOAL_THEN
470    `!z. &0 < Re z ==> ((nearzeta n) has_complex_derivative g' z) (at z)`
471   ASSUME_TAC THENL
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;
480     ALL_TAC] THEN
481   ASM_MESON_TAC[HAS_COMPLEX_DERIVATIVE_DERIVATIVE]);;
482
483 let NEARZETA_CONVERGES = prove
484  (`!n s. &0 < Re s
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
491   SUBGOAL_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])
494   THENL
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[]]]);;
498
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]);;
506
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]);;
511
512 let COMPLEX_DIFFERENTIABLE_NEARZETA = prove
513  (`!n s. 1 <= n /\ &0 < Re s ==> (nearzeta n) complex_differentiable (at s)`,
514   REPEAT GEN_TAC THEN
515   DISCH_THEN(MP_TAC o MATCH_MP HOLOMORPHIC_NEARZETA_STRONG) THEN
516   MESON_TAC[complex_differentiable]);;
517
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
525   DISCH_TAC 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);;
530
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))) /
536                   (z - Cx(&1))` THEN
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]]);;
548
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]);;
556
557 (* ------------------------------------------------------------------------- *)
558 (* Euler product formula. Nice proof from Ahlfors' book avoiding any         *)
559 (* messing round with the geometric series.                                  *)
560 (* ------------------------------------------------------------------------- *)
561
562 let SERIES_DIVISORS_LEMMA = prove
563  (`!x p l k.
564       ((\n. x(p * n)) sums l) k
565       ==> ~(p = 0) /\
566           (!n. (p * n) IN k <=> n IN k)
567           ==> (x sums l) {n | n IN k /\ p divides n}`,
568   REPEAT GEN_TAC THEN
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[]);;
585
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)}`,
591   let lemma = prove
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
599      `s INTER t = {}
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
621   ANTS_TAC THENL
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];
629     ALL_TAC] THEN
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
634   SET_TAC[]);;
635
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]]);;
653
654 let EULER_PRODUCT_MULTIPLY = prove
655  (`!s. &1 < Re s
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
660   EXISTS_TAC
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
664   CONJ_TAC THENL
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];
671     ALL_TAC] THEN
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)`
674   MP_TAC THENL
675    [MP_TAC(SPEC `Cx(Re s)` ZETA_CONVERGES) THEN
676     ASM_SIMP_TAC[RE_CX] THEN MESON_TAC[];
677     ALL_TAC] THEN
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
683   DISCH_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
699    `vsum
700      ({m | 1 <= m /\ (!p. prime p /\ p divides m ==> n < p)} INTER
701       (0..N1 + N2 + 1))
702      (\n. Cx (&1) / Cx (&n) cpow s) - Cx(&1) =
703     vsum
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)`
707   SUBST1_TAC THENL
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`];
713     ALL_TAC] THEN
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];
719     ALL_TAC] THEN
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;
723                NORM_CPOW_REAL] THEN
724   SIMP_TAC[REAL_INV; REAL_CX; GSYM CX_INV; RE_CX; REAL_LE_REFL]);;
725
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);;
736
737 let EULER_PRODUCT = prove
738  (`!s. &1 < Re s
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]);;
752
753 (* ------------------------------------------------------------------------- *)
754 (* Show that s = 1 is not a zero, just for tidiness.                         *)
755 (* ------------------------------------------------------------------------- *)
756
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]);;
771
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)))`
776   MP_TAC THENL
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];
800       ALL_TAC] THEN
801     SIMP_TAC[GSYM REAL_EXP_N; REAL_DIV_LMUL; REAL_OF_NUM_EQ; ARITH] THEN
802     REAL_ARITH_TAC]);;
803
804 (* ------------------------------------------------------------------------- *)
805 (* Lack of zeros on Re(s) >= 1. Nice proof from Bak & Newman.                *)
806 (* ------------------------------------------------------------------------- *)
807
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)`,
813   let lemma1 = prove
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
824     ASM_REAL_ARITH_TAC)
825   and lemma2 = prove
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
834   EXISTS_TAC
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}
840                  (\p. inv(Cx(&1) -
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];
849     ALL_TAC] THEN
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;
873     ALL_TAC] THEN
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;
892               GSYM CX_MUL] THEN
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`;
915                  PRIME_GE_2] THEN
916     ASM_REAL_ARITH_TAC;
917     ALL_TAC] THEN
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`;
928                 REAL_LE_SQUARE] THEN
929     GEN_REWRITE_TAC LAND_CONV [GSYM REAL_POW2_ABS] THEN
930     MATCH_MP_TAC REAL_POW_LE2 THEN ASM_REAL_ARITH_TAC;
931     ALL_TAC] THEN
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];
948     ALL_TAC] THEN
949   SUBGOAL_THEN `&0 <= r pow 3` MP_TAC THENL
950    [ASM_SIMP_TAC[REAL_POW_LE]; REAL_ARITH_TAC]);;
951
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))`
963   MP_TAC THENL
964    [REWRITE_TAC[COMPLEX_NORM_CX; COMPLEX_MUL_LZERO] THEN REAL_ARITH_TAC;
965     SIMP_TAC[]] THEN
966   MATCH_MP_TAC(ISPEC `at (Cx(&1)) within {s | real s /\ &1 < Re s}`
967    LIM_NORM_LBOUND) THEN
968   EXISTS_TAC
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}`
973   ASSUME_TAC THENL
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;
979     ALL_TAC] THEN
980   ASM_REWRITE_TAC[] THEN CONJ_TAC THENL
981    [ALL_TAC;
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
987   CONJ_TAC THENL
988    [ALL_TAC;
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
1006      `~(x = Cx(&0))
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];
1010     ALL_TAC] THEN
1011   MATCH_MP_TAC LIM_COMPLEX_MUL THEN CONJ_TAC THENL
1012    [ALL_TAC;
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})`
1017     MP_TAC THENL
1018      [ALL_TAC;
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
1032   CONJ_TAC THENL
1033    [SIMP_TAC[LIM_WITHIN; CPOW_1; GSYM DIST_NZ; zeta; genzeta; COMPLEX_DIV_1;
1034     COMPLEX_FIELD
1035     `~(x:complex = a)
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];
1041     ALL_TAC] THEN
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]);;
1051
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);;
1059
1060 (* ------------------------------------------------------------------------- *)
1061 (* The logarithmic derivative of the zeta function.                          *)
1062 (* ------------------------------------------------------------------------- *)
1063
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
1069   ANTS_TAC THENL
1070    [ALL_TAC;
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
1084     ASM_REAL_ARITH_TAC;
1085     ALL_TAC] 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);;
1089
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)))
1094                  sums logzeta(s))
1095                 {p | prime p} /\
1096                 ((\p. clog(Cx(&p)) / (Cx(&p) cpow s - Cx(&1)))
1097                  sums logzeta'(s))
1098                 {p | prime p} /\
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`;
1120                  PRIME_GE_2] THEN
1121     ASM_REAL_ARITH_TAC;
1122     ALL_TAC] THEN
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
1127   CONJ_TAC THENL
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;
1140     ALL_TAC] THEN
1141   CONJ_TAC THENL
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;
1144              REAL_EXP_POS_LE];
1145     ALL_TAC] THEN
1146   SUBGOAL_THEN
1147    `summable (from 1) (\n. Cx (&1) / Cx (&n) cpow (Cx(&1 + (Re s - &1) / &2)))`
1148   MP_TAC THENL
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;
1153     ALL_TAC] THEN
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);;
1174
1175 let LOGZETA_PROPERTIES =
1176   new_specification ["logzeta"; "logzeta'"] LOGZETA_EXISTS;;
1177
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);;
1182
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
1186   EXISTS_TAC
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]);;
1216
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;
1228     ALL_TAC] THEN
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]);;
1235
1236 let COMPLEX_DERIVATIVE_ZETA = prove
1237  (`!s. &1 < Re s
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]);;
1241
1242 let CONVERGES_LOGZETA'' = prove
1243  (`!s. &1 < Re s
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)`
1248   SUBST1_TAC THENL
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]]);;
1255
1256 (* ------------------------------------------------------------------------- *)
1257 (* Some lemmas about negating a path.                                        *)
1258 (* ------------------------------------------------------------------------- *)
1259
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]);;
1264
1265 let PATHSTART_NEGATEPATH = prove
1266  (`!g. pathstart((--) o g) = --(pathstart g)`,
1267   REWRITE_TAC[pathstart; o_THM]);;
1268
1269 let PATHFINISH_NEGATEPATH = prove
1270  (`!g. pathfinish((--) o g) = --(pathfinish g)`,
1271   REWRITE_TAC[pathfinish; o_THM]);;
1272
1273 let PATH_IMAGE_NEGATEPATH = prove
1274  (`!g. path_image((--) o g) = IMAGE (--) (path_image g)`,
1275   REWRITE_TAC[path_image; IMAGE_o]);;
1276
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]);;
1297
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]);;
1312
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]);;
1318
1319 (* ------------------------------------------------------------------------- *)
1320 (* Some bounding lemmas given by Newman. BOUND_LEMMA_2 is my variant since I *)
1321 (* use a slightly different contour.                                         *)
1322 (* ------------------------------------------------------------------------- *)
1323
1324 let BOUND_LEMMA_0 = prove
1325  (`!z R. norm(z) = R
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]);;
1333
1334 let BOUND_LEMMA_1 = prove
1335  (`!z R. norm(z) = R
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`]);;
1340
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];
1362     ALL_TAC] THEN
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]);;
1382
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))`,
1388   let lemma1 = prove
1389    (`!n x.
1390           &1 <= x
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;
1397       ALL_TAC] THEN
1398     MP_TAC(ISPECL
1399      [`\n. n cpow (Cx(x) - Cx(&1))`;
1400       `\n. n cpow (Cx(x)) / (Cx(x))`;
1401       `1`; `n:num`]
1402     SUM_INTEGRAL_UBOUND_INCREASING) THEN
1403     ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
1404      [CONJ_TAC THENL
1405        [X_GEN_TAC `u:complex` THEN STRIP_TAC THEN COMPLEX_DIFF_TAC THEN
1406         CONJ_TAC THENL
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;
1411           ALL_TAC] THEN
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];
1415         ALL_TAC] THEN
1416       MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN
1417       STRIP_TAC 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
1425       ASM_REAL_ARITH_TAC;
1426       ALL_TAC] THEN
1427     MATCH_MP_TAC(REAL_ARITH `x = y /\ u <= v ==> x <= u ==> y <= v`) THEN
1428     CONJ_TAC THENL
1429      [MATCH_MP_TAC SUM_EQ_NUMSEG THEN
1430       REWRITE_TAC[GSYM CX_SUB];
1431       ALL_TAC] THEN
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)
1440   and lemma1' = prove
1441    (`!n x.
1442           &0 < x /\ x <= &1
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];
1449       ALL_TAC] THEN
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
1453      [ALL_TAC;
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
1460     MP_TAC(ISPECL
1461      [`\n. n cpow (Cx(x) - Cx(&1))`;
1462       `\n. n cpow (Cx(x)) / (Cx(x))`;
1463       `2`; `n:num`]
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
1468         CONJ_TAC THENL
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
1475           REAL_ARITH_TAC;
1476           ALL_TAC] 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];
1480         ALL_TAC] THEN
1481       MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN
1482       STRIP_TAC 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
1492       ASM_REAL_ARITH_TAC;
1493       ALL_TAC] 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];
1500       ALL_TAC] THEN
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
1509   CONJ_TAC THENL
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;
1521     ALL_TAC] THEN
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
1533     CONJ_TAC THENL
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];
1537       ALL_TAC] THEN
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]]);;
1543
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
1552   CONJ_TAC THENL
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;
1566     ALL_TAC] THEN
1567   ABBREV_TAC `x = Re z` THEN
1568   ASM_CASES_TAC `n + 1 <= m` THENL
1569    [ALL_TAC;
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
1574   MP_TAC(ISPECL
1575    [`\n. n cpow (--(Cx(x) + Cx(&1)))`;
1576     `\n. --(n cpow (--(Cx(x)))) / Cx(x)`;
1577     `n + 1`; `m:num`]
1578    SUM_INTEGRAL_UBOUND_DECREASING) THEN
1579   ASM_REWRITE_TAC[GSYM REAL_OF_NUM_ADD; REAL_ARITH `(x + &1) - &1 = x`] THEN
1580   ANTS_TAC THENL
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
1583       CONJ_TAC THENL
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;
1591         ALL_TAC] THEN
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];
1596       ALL_TAC] THEN
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
1601       ASM_REAL_ARITH_TAC;
1602       ALL_TAC] 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
1609     ASM_REAL_ARITH_TAC;
1610     ALL_TAC] THEN
1611   MATCH_MP_TAC(REAL_ARITH
1612    `x = y /\ u <= v ==> x <= u ==> y <= v`) THEN
1613   CONJ_TAC THENL
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;
1618       ALL_TAC] THEN
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];
1622     ALL_TAC] THEN
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]);;
1633
1634 (* ------------------------------------------------------------------------- *)
1635 (* Our overall bound does go to zero as N increases.                         *)
1636 (* ------------------------------------------------------------------------- *)
1637
1638 let OVERALL_BOUND_LEMMA = prove
1639  (`!d M R. &0 < d
1640            ==> !e. &0 < e
1641                    ==> ?N. !n. N <= n
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]]);;
1659
1660 (* ------------------------------------------------------------------------- *)
1661 (* Newman/Ingham analytic lemma (as in Newman's book).                       *)
1662 (* ------------------------------------------------------------------------- *)
1663
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))
1668          ==> !z. Re(z) >= &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
1680   SUBGOAL_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"))))
1685   THENL
1686    [SUBGOAL_THEN
1687      `?d. &0 < d /\
1688           (\z. f(w + z)) holomorphic_on {z | Re(z) >= --d /\ abs(Im z) <= R}`
1689      (X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC)
1690     THENL
1691      [ALL_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
1698     SUBGOAL_THEN
1699      `!z. &0 <= Re z ==> ?e. &0 < e /\ g holomorphic_on ball (z,e)`
1700     MP_TAC THENL
1701      [X_GEN_TAC `z:complex` THEN DISCH_TAC THEN
1702       UNDISCH_TAC
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;
1714       ALL_TAC] THEN
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
1723     ANTS_TAC THENL
1724      [CONJ_TAC THENL
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];
1733         ALL_TAC] THEN
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];
1741       ALL_TAC] THEN
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
1750     ANTS_TAC THENL
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;
1755       DISCH_TAC] THEN
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[];
1763       ALL_TAC] THEN
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;
1769                     CENTRE_IN_BALL];
1770       ALL_TAC] THEN
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
1773     ANTS_TAC THENL
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;
1777       ALL_TAC] THEN
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;
1787       ALL_TAC] THEN
1788     ASM_REWRITE_TAC[IN_ELIM_THM; RE_SUB; IM_SUB; RE; IM] THEN
1789     DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN
1790     UNDISCH_TAC
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;
1812     ALL_TAC] THEN
1813   SUBGOAL_THEN
1814    `?M. &0 < M /\
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
1823     CONJ_TAC THENL
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
1827       SET_TAC[];
1828       ALL_TAC] 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;
1836       ALL_TAC] THEN
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];
1842     ALL_TAC] THEN
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
1851   DISCH_TAC 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
1859   SUBGOAL_THEN
1860    `valid_path A /\
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;
1875     ALL_TAC] THEN
1876   SUBGOAL_THEN `path_image A SUBSET {z | Re(z) >= &0 /\ norm(z) = R}`
1877   ASSUME_TAC THENL
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];
1889     ALL_TAC] THEN
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;
1895     ALL_TAC] THEN
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
1899   SUBGOAL_THEN
1900    `valid_path B /\
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
1908            CONJ_TAC) THEN
1909     (REWRITE_TAC[VALID_PATH_LINEPATH] THEN CONJ_TAC THENL
1910       [ALL_TAC;
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;
1913                    RE_CX; IM_CX] THEN
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];
1921     ALL_TAC] THEN
1922   SUBGOAL_THEN
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];
1929     ALL_TAC] THEN
1930   SUBGOAL_THEN
1931    `path_image B SUBSET {z | --d <= Re z /\ Re(z) <= &0 /\ abs(Im z) <= R}`
1932   ASSUME_TAC THENL
1933    [SUBGOAL_THEN
1934      `convex {z | --d <= Re z /\ Re z <= &0 /\ abs (Im z) <= R}`
1935     ASSUME_TAC THENL
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];
1942       ALL_TAC] THEN
1943     EXPAND_TAC "B" THEN
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;
1954     ALL_TAC] THEN
1955   SUBGOAL_THEN
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];
1963     ALL_TAC] THEN
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;
1979     ALL_TAC] THEN
1980   SUBGOAL_THEN
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)`
1983   ASSUME_TAC THENL
1984    [MP_TAC(ISPECL
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`;
1988       `Cx(&0)`]
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
1995      [ALL_TAC;
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
2001     CONJ_TAC THENL
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];
2007       ALL_TAC] THEN
2008     CONJ_TAC THENL
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];
2019       ALL_TAC] THEN
2020     CONJ_TAC THENL
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];
2029       ALL_TAC] THEN
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;
2038     ALL_TAC] THEN
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)`
2045   ASSUME_TAC THENL
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];
2050     ALL_TAC] THEN
2051   ABBREV_TAC `A' = (--) o (A:real^1->complex)` THEN
2052   SUBGOAL_THEN
2053    `valid_path A' /\
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];
2066     ALL_TAC] THEN
2067   SUBGOAL_THEN
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];
2076     ALL_TAC] THEN
2077   SUBGOAL_THEN `path_image A' SUBSET {z | Re z <= &0 /\ norm z = R}`
2078   ASSUME_TAC THENL
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;
2084     ALL_TAC] THEN
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;
2101     ALL_TAC] THEN
2102   SUBGOAL_THEN
2103    `(\z. S_N (w + z) * Cx (&N) cpow z * (Cx (&1) + z pow 2 * inv (Cx R pow 2)))
2104     holomorphic_on (:complex)`
2105   ASSUME_TAC THENL
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];
2117     ALL_TAC] THEN
2118   SUBGOAL_THEN
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')`
2121   MP_TAC THENL
2122    [MP_TAC(ISPECL
2123      [`\z. S_N(w + z) * Cx(&N) cpow z * (Cx(&1) + z pow 2 / Cx(R) pow 2)`;
2124       `cball(Cx(&0),R)`;
2125       `A ++ A':real^1->complex`;
2126       `Cx(&0)`]
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
2134      [ALL_TAC;
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
2140     CONJ_TAC THENL
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;
2147              NORM_NEG] THEN
2148     REAL_ARITH_TAC;
2149     ALL_TAC] THEN
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
2156   SUBGOAL_THEN
2157    `integral_sA + integral_sA' = Cx(&2) * Cx pi * ii * S_N(w:complex)`
2158   ASSUME_TAC THENL
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];
2163     ALL_TAC] THEN
2164   SUBGOAL_THEN
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];
2180     ALL_TAC] THEN
2181   SUBGOAL_THEN
2182    `(\z. r_N(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx(R) pow 2))
2183     path_integrable_on A`
2184   MP_TAC THENL
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[];
2189     ALL_TAC] THEN
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`
2193   ASSUME_TAC THENL
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[];
2201     ALL_TAC] THEN
2202   SUBGOAL_THEN
2203    `r_N(w:complex) = ((integral_rA - integral_sA') + integral_fB) /
2204                       (Cx(&2) * Cx(pi) * ii)`
2205   SUBST1_TAC THENL
2206    [SIMP_TAC[COMPLEX_FIELD `~(z = Cx(&0)) ==> (x = y / z <=> z * x = y)`;
2207              CX_2PII_NZ] THEN
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;
2212     ALL_TAC] THEN
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
2220   CONJ_TAC THENL
2221    [ALL_TAC;
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
2237    [MP_TAC(ISPECL
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`;
2240       `&2 / R pow 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
2251     STRIP_TAC 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;
2265       ALL_TAC] THEN
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
2269     CONJ_TAC THENL
2270      [ALL_TAC;
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
2277      [ALL_TAC;
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
2282     EXISTS_TAC
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
2285     CONJ_TAC THENL
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];
2294       ALL_TAC] THEN
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
2300     CONJ_TAC THENL
2301      [ALL_TAC;
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
2306     ANTS_TAC THENL
2307      [MAP_EVERY UNDISCH_TAC [`~(N = 0)`; `N + 1 <= n`] THEN ARITH_TAC;
2308       ALL_TAC] THEN
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;
2312
2313     MP_TAC(ISPECL
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;
2327                    REAL_LT_IMP_LE];
2328       ALL_TAC] THEN
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
2332     STRIP_TAC 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;
2346       ALL_TAC] THEN
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
2350     CONJ_TAC THENL
2351      [ALL_TAC;
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)`];
2371       ALL_TAC] THEN
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];
2376
2377     ALL_TAC] THEN
2378   SUBGOAL_THEN
2379    `(\z. f(w + z) * Cx(&N) cpow z * (Cx(&1) / z + z / Cx R pow 2))
2380     path_integrable_on B`
2381   MP_TAC THENL
2382    [ASM_MESON_TAC[path_integrable_on]; ALL_TAC] THEN
2383   EXPAND_TAC "B" 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
2391   SUBGOAL_THEN
2392    `integral_fB:complex = integral_fC + integral_fD + integral_fC'`
2393   SUBST1_TAC THENL
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]);
2402     ALL_TAC] THEN
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
2406   CONJ_TAC THENL
2407    [MP_TAC(SPECL
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
2414      [ALL_TAC;
2415       SUBGOAL_THEN `complex (--d,--R) - complex (--d,R) =
2416                     Cx(&2) * ii * Cx(--R)`
2417       SUBST1_TAC THENL
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
2420         REAL_ARITH_TAC;
2421         ALL_TAC] 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
2426     CONJ_TAC THENL
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];
2430       ALL_TAC] THEN
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
2436       REAL_ARITH_TAC;
2437       ALL_TAC] THEN
2438     SUBGOAL_THEN `segment[complex(--d,R),complex(--d,--R)] SUBSET
2439                        {z | abs(Im z) <= R}`
2440     MP_TAC THENL
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;
2448       ALL_TAC] THEN
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;
2456       ALL_TAC] THEN
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];
2462       ALL_TAC] THEN
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;
2466       ALL_TAC] THEN
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
2473     CONJ_TAC THENL
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
2488       REAL_ARITH_TAC;
2489       ALL_TAC] 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;
2494     ALL_TAC] THEN
2495   MP_TAC(ISPECL
2496    [`\z. --(inv(clog(Cx(&N)) pow 2)) * (Cx(&1) + z * clog(Cx(&N))) *
2497          Cx(&N) cpow (--z)`;
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];
2510     ALL_TAC] THEN
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
2521   ABBREV_TAC
2522    `integral_bound =
2523     inv(log(&N) pow 2) *
2524     (&1 - (&1 + d * log(&N)) * inv(exp(d * log (&N))))` THEN
2525   SUBGOAL_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
2537     CONJ_TAC THENL
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];
2541     ALL_TAC] THEN
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
2545    [UNDISCH_TAC
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)))`;
2549     UNDISCH_TAC
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
2554    [ALL_TAC;
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
2564   (SUBGOAL_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])
2573    THENL
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
2578      REAL_ARITH_TAC;
2579      ALL_TAC] 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
2585    ANTS_TAC THENL
2586     [ALL_TAC;
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
2618    CONJ_TAC THENL
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
2623       [ALL_TAC;
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];
2626      ALL_TAC] THEN
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));;
2632
2633 (* ------------------------------------------------------------------------- *)
2634 (* The application is to any bounded a_n, not |a_n| <= 1, so...              *)
2635 (* ------------------------------------------------------------------------- *)
2636
2637 let NEWMAN_INGHAM_THEOREM_BOUND = prove
2638  (`!f a b. &0 < b /\
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))
2642            ==> !z. Re(z) >= &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]);;
2660
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))
2665            ==> !z. Re(z) >= &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`]);;
2672
2673 (* ------------------------------------------------------------------------- *)
2674 (* Newman's analytic function "f", re-using our "nearzeta" stuff.            *)
2675 (* ------------------------------------------------------------------------- *)
2676
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
2685   MP_TAC(SPECL
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
2690   ANTS_TAC THENL
2691    [CONJ_TAC THENL
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
2694       STRIP_TAC THENL
2695        [ALL_TAC;
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;
2701         ALL_TAC] THEN
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
2707       CONJ_TAC THENL
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];
2711       ALL_TAC] THEN
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
2715       ASM_REAL_ARITH_TAC;
2716       ALL_TAC] 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
2724     ASM_REAL_ARITH_TAC;
2725     ALL_TAC] THEN
2726   MATCH_MP_TAC(REAL_ARITH `x = y /\ a <= b ==> x <= a ==> y <= b`) THEN
2727   CONJ_TAC THENL
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];
2733     ALL_TAC] THEN
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]);;
2752
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]);;
2768
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
2776   EXISTS_TAC
2777     `\m. vsum(n..m)
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
2791   CONJ_TAC THENL
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];
2795     ALL_TAC] THEN
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]);;
2805
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
2824   CONJ_TAC THENL
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];
2827     ALL_TAC] THEN
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);;
2834
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
2845     CONJ_TAC THENL
2846      [MATCH_MP_TAC COMPLEX_DIFFERENTIABLE_MUL_AT THEN CONJ_TAC THENL
2847        [ALL_TAC;
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];
2852       ALL_TAC] THEN
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`];
2857     ALL_TAC] THEN
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) *
2861                   clog(Cx(&p)) /
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
2865   CONJ_TAC THENL
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
2873     EXISTS_TAC
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;
2882     ALL_TAC] THEN
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`;
2891                    PRIME_GE_2]];
2892     ALL_TAC] THEN
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
2902   CONJ_TAC THENL
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
2913     CONJ_TAC THENL
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;
2917       DISCH_TAC] THEN
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
2925     CONJ_TAC THENL
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
2929     CONJ_TAC THENL
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;
2934       ALL_TAC] THEN
2935     ASM_SIMP_TAC[NORM_CPOW_REAL; REAL_CX; RE_CX; REAL_OF_NUM_LT; PRIME_IMP_NZ;
2936                  LT_NZ] THEN
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`;
2941                  PRIME_GE_2] THEN
2942     MP_TAC(SPEC `s - z:complex` COMPLEX_NORM_GE_RE_IM) THEN
2943     REWRITE_TAC[RE_SUB] THEN ASM_REAL_ARITH_TAC;
2944     ALL_TAC] THEN
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;
2959                  COMPLEX_VEC_0] THEN
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;
2977     ALL_TAC] THEN
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`;
2986                PRIME_GE_2] THEN
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);;
2989
2990 let nearnewman = new_specification ["nearnewman"] NEARNEWMAN_EXISTS;;
2991
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)`]
2995                 nearnewman);;
2996
2997 let newman = new_definition
2998  `newman(s) = (nearnewman(s) - (complex_derivative zeta s / zeta s)) /
2999               (s - Cx(&1))`;;
3000
3001 (* ------------------------------------------------------------------------- *)
3002 (* Careful correlation of singularities of the various functions.            *)
3003 (* ------------------------------------------------------------------------- *)
3004
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
3017   CONJ_TAC THENL
3018    [X_GEN_TAC `w:complex` THEN COND_CASES_TAC THEN
3019     ASM_REWRITE_TAC[REAL_LT_REFL];
3020     ALL_TAC] THEN
3021   MP_TAC(SPECL
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`;
3025     `s:complex`]
3026    HAS_COMPLEX_DERIVATIVE_MUL_AT) THEN
3027   REWRITE_TAC[] THEN ANTS_TAC THENL
3028    [ALL_TAC;
3029     MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN
3030     SIMPLE_COMPLEX_ARITH_TAC] THEN
3031   CONJ_TAC THENL
3032    [ALL_TAC;
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]);;
3042
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}`,
3048   EXISTS_TAC
3049    `complex_derivative
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)))`;
3058     `Cx(&1)`] THEN
3059   SIMP_TAC[NEARZETA_1; ARITH] THEN
3060   REWRITE_TAC[COMPLEX_ADD_LID; COMPLEX_INV_1; COMPLEX_SUB_REFL;
3061               COMPLEX_MUL_LZERO] THEN
3062   CONJ_TAC THENL
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
3082     ANTS_TAC THENL
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;
3091       ALL_TAC] THEN
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;
3099       ALL_TAC] THEN
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]);;
3105
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
3112   EXISTS_TAC
3113    `complex_derivative
3114      (\z. nearnewman z +
3115           (if z = Cx(&1)
3116            then c
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)))
3120      (Cx(&1))` THEN
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))`;
3128     `Cx(&1)`] THEN
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
3136       REAL_ARITH_TAC;
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]);;
3150
3151 (* ------------------------------------------------------------------------- *)
3152 (* Hence apply the analytic lemma.                                           *)
3153 (* ------------------------------------------------------------------------- *)
3154
3155 let CONVERGES_NEWMAN_PRIME = prove
3156  (`!s. &1 < Re s
3157        ==> ((\p. clog(Cx(&p)) / Cx(&p) * genzeta p s) sums newman(s))
3158            {p | prime p}`,
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]);;
3183
3184 (* ------------------------------------------------------------------------- *)
3185 (* Now swap the order of summation in the series.                            *)
3186 (* ------------------------------------------------------------------------- *)
3187
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) =
3191                genzeta (n + 1) 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
3198   ASM_ARITH_TAC);;
3199
3200 let NEWMAN_CONVERGES = prove
3201  (`!s. &1 < Re s
3202        ==> ((\n. vsum {p | prime p /\ p <= n} (\p. clog(Cx(&p)) / Cx(&p)) /
3203                  Cx(&n) cpow s)
3204             sums (newman s)) (from 1)`,
3205   let lemma = prove
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];
3223          ALL_TAC] THEN
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
3228   SUBGOAL_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`
3232   MP_TAC THENL
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;
3241     ALL_TAC] THEN
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
3257   EXISTS_TAC
3258    `norm(vsum {p | prime p /\ p <= n}
3259               (\p. clog(Cx(&p)) / Cx(&p) * genzeta (n + 1) s))` THEN
3260   CONJ_TAC THENL
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];
3263     ALL_TAC] THEN
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
3280     CONJ_TAC THENL
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
3299     CONJ_TAC THENL
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;
3304       ALL_TAC] THEN
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
3313     REAL_ARITH_TAC]);;
3314
3315 (* ------------------------------------------------------------------------- *)
3316 (* Hence the main result of the analytic part.                               *)
3317 (* ------------------------------------------------------------------------- *)
3318
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)) -
3329          clog(Cx(&n)) + c`;
3330     `&24 + norm(c:complex)`]
3331   NEWMAN_INGHAM_THEOREM_STRONG) THEN
3332   ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
3333    [ALL_TAC;
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
3340   CONJ_TAC THENL
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];
3352     ALL_TAC] THEN
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
3355   DISCH_TAC 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
3358   CONJ_TAC THENL
3359    [ALL_TAC;
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
3365    [ALL_TAC;
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]);;
3370
3371 (* ------------------------------------------------------------------------- *)
3372 (* The theorem relating summability and convergence.                         *)
3373 (* ------------------------------------------------------------------------- *)
3374
3375 let SUM_GOESTOZERO_LEMMA = prove
3376  (`!a M N.
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;
3392     ALL_TAC] THEN
3393   REWRITE_TAC[GSYM REAL_LE_SUB_RADD] THEN
3394   SUBGOAL_THEN `!m n. &m <= &n ==> a m + log(&m) <= a n + log(&n)`
3395   ASSUME_TAC THENL
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;
3398     ALL_TAC] THEN
3399   REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN REWRITE_TAC[GSYM real_div] THEN
3400   CONJ_TAC THEN
3401   (MATCH_MP_TAC REAL_LE_TRANS THEN
3402    EXISTS_TAC `(d * &N) / (&N - &M + &1)` THEN CONJ_TAC THENL
3403     [ALL_TAC;
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
3421     REAL_ARITH_TAC;
3422     ALL_TAC]) 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;
3432       ALL_TAC] THEN
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
3441      [ALL_TAC;
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`]]);;
3453
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`,
3458   let lemma = prove
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
3482    [CONJ_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
3487       CONJ_TAC THENL
3488        [ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
3489         ASM_SIMP_TAC[GSYM REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LT_NZ] THEN
3490         ASM_REAL_ARITH_TAC;
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];
3498     ALL_TAC] THEN
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])
3508   THENL
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
3525   CONJ_TAC THENL
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
3540     ASM_REAL_ARITH_TAC;
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`]]);;
3545
3546 (* ------------------------------------------------------------------------- *)
3547 (* Hence transform into the desired limit.                                   *)
3548 (* ------------------------------------------------------------------------- *)
3549
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]);;
3579
3580 (* ------------------------------------------------------------------------- *)
3581 (* Reformulate the PNT using partial summation.                              *)
3582 (* ------------------------------------------------------------------------- *)
3583
3584 let PNT_PARTIAL_SUMMATION = prove
3585  (`&(CARD {p | prime p /\ p <= n}) =
3586         sum(1..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`]);;
3606
3607 let SUM_PARTIAL_LIMIT = prove
3608  (`!f e c M.
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)
3625   THENL
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`];
3631     ALL_TAC] THEN
3632   SUBGOAL_THEN
3633    `!n. N + 1 <= n
3634         ==> abs((sum((N+1)..n) (\k. e k * (f (k + 1) - f k)) -
3635                  e(n) * f(n + 1)) +
3636                 c * f(N + 1))
3637             <= d / &2 * f(n + 1)`
3638   MP_TAC THENL
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`];
3649       ALL_TAC] THEN
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`];
3668     ALL_TAC] THEN
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
3686   REAL_ARITH_TAC);;
3687
3688 let SUM_PARTIAL_LIMIT_ALT = prove
3689  (`!f e b c M.
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
3699   EXISTS_TAC
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`];
3707     ALL_TAC] THEN
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[]);;
3711
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]]);;
3722
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);;
3729
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;
3741     ALL_TAC] THEN
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
3751   CONJ_TAC THENL
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];
3757     ALL_TAC] THEN
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);;
3765
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);;
3772
3773 let ADHOC_BOUND_LEMMA = prove
3774  (`!k. 1 <= k ==> abs((&k + &1) * (log(&k + &1) - log(&k)) - &1)
3775                   <= &2 / &k`,
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
3793   ANTS_TAC THENL
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;
3802     ALL_TAC] THEN
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
3824   CONJ_TAC THENL
3825    [ASM_SIMP_TAC[GSYM real_div; REAL_ABS_DIV; REAL_LE_LDIV_EQ;
3826                  REAL_ARITH `&0 < x ==> abs x = x`] THEN
3827     ASM_REAL_ARITH_TAC;
3828     ALL_TAC] 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);;
3835
3836 let REALLIM_MUL_SERIES = prove
3837  (`!x y z B.
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
3848   MP_TAC(ASSUME
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
3864   MP_TAC(ASSUME
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])
3877   THENL
3878    [ASM_SIMP_TAC[REAL_ABS_DIV; REAL_ARITH `&0 < n ==> abs n = n`;
3879                  ARITH_RULE `N + 1 <= n ==> N <= n`];
3880     ALL_TAC] THEN
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
3885   CONJ_TAC THENL
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`];
3897     ALL_TAC] THEN
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);;
3913
3914 let REALLIM_MUL_SERIES_LIM = prove
3915  (`!x y z l.
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]);;
3929
3930 (* ------------------------------------------------------------------------- *)
3931 (* Finally, the Prime Number Theorem!                                        *)
3932 (* ------------------------------------------------------------------------- *)
3933
3934 let PNT = prove
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];
3943     ALL_TAC] THEN
3944   REWRITE_TAC[SUM_CLAUSES; REAL_MUL_RZERO; REAL_SUB_RZERO] THEN
3945   MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN
3946   EXISTS_TAC
3947    `\n. ((&n + &1) / log(&n + &1) *
3948          sum {p | prime p /\ p <= n} (\p. log(&p) / &p) -
3949          sum (1..n)
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
3952   CONJ_TAC THENL
3953    [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN SIMP_TAC[];
3954     ALL_TAC] THEN
3955   MATCH_MP_TAC REALLIM_TRANSFORM THEN
3956   EXISTS_TAC
3957    `\n. ((&n + &1) / log(&n + &1) * log(&n) -
3958          sum (1..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
3974      [ALL_TAC;
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;
3997         ALL_TAC] THEN
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;
4005       ALL_TAC] THEN
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
4012       ASM_REAL_ARITH_TAC;
4013       ALL_TAC] 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
4023       ASM_REAL_ARITH_TAC;
4024       ALL_TAC] 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;
4031     ALL_TAC] THEN
4032   REWRITE_TAC[REAL_OF_NUM_ADD] THEN ONCE_REWRITE_TAC[SUM_PARTIAL_SUC] THEN
4033   MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN
4034   EXISTS_TAC
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
4038   CONJ_TAC THENL
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
4041     REAL_ARITH_TAC;
4042     ALL_TAC] 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
4048   EXISTS_TAC
4049    `\n. sum(1..n) (\k. &1 / log(&k + &1) - &1 / log(&k + &1) pow 2) /
4050         ((&n + &1) / log(&n + &1))` THEN
4051   REWRITE_TAC[] 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))`;
4063       `16`; `n:num`]
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
4080           ASM_REAL_ARITH_TAC;
4081           ALL_TAC] 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
4087         ASM_REAL_ARITH_TAC;
4088         ALL_TAC] 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;
4109         ALL_TAC] THEN
4110       CONJ_TAC THENL
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];
4113       ALL_TAC] THEN
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
4133       REAL_ARITH_TAC;
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];
4146         ALL_TAC] THEN
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
4169       REAL_ARITH_TAC;
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;
4181         ALL_TAC] THEN
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]];
4186     ALL_TAC] THEN
4187   DISCH_TAC THEN
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
4199      [ALL_TAC;
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
4209     CONJ_TAC THENL
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;
4213       ALL_TAC] THEN
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;
4223     ALL_TAC] THEN
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
4232      [ALL_TAC;
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
4241      `&0 <= y /\ y <= x
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;
4246       ALL_TAC] THEN
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];
4254     ALL_TAC] THEN
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
4272     ASM_REAL_ARITH_TAC;
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];
4282     ALL_TAC] THEN
4283   MATCH_MP_TAC REALLIM_TRANSFORM_BOUND THEN
4284   EXISTS_TAC `\n. &2 / log(&n + &1)` THEN CONJ_TAC THENL
4285    [ALL_TAC;
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
4297     ASM_REAL_ARITH_TAC;
4298     ALL_TAC] 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
4310    `l pow 2 <= l / &2
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);;