1 (* ========================================================================= *)
2 (* Dirichlet's theorem. *)
3 (* ========================================================================= *)
5 needs "Library/products.ml";;
6 needs "Library/agm.ml";;
7 needs "Multivariate/transcendentals.ml";;
8 needs "Library/pocklington.ml";;
9 needs "Library/multiplicative.ml";;
10 needs "Examples/mangoldt.ml";;
13 prioritize_complex();;
15 (* ------------------------------------------------------------------------- *)
16 (* Rearranging a certain kind of double sum. *)
17 (* ------------------------------------------------------------------------- *)
19 let VSUM_VSUM_DIVISORS = prove
20 (`!f x. vsum (1..x) (\n. vsum {d | d divides n} (f n)) =
21 vsum (1..x) (\n. vsum (1..(x DIV n)) (\k. f (k * n) n))`,
22 SIMP_TAC[VSUM; FINITE_DIVISORS; LE_1] THEN
23 SIMP_TAC[VSUM; FINITE_NUMSEG; ITERATE_ITERATE_DIVISORS;
24 MONOIDAL_VECTOR_ADD]);;
26 (* ------------------------------------------------------------------------- *)
27 (* Useful approximation lemmas. *)
28 (* ------------------------------------------------------------------------- *)
30 let REAL_EXP_1_LE_4 = prove
32 ONCE_REWRITE_TAC[ARITH_RULE `&1 = &1 / &2 + &1 / &2`; REAL_EXP_ADD] THEN
33 REWRITE_TAC[REAL_ARITH `&4 = &2 * &2`; REAL_EXP_ADD] THEN
34 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[REAL_EXP_POS_LE] THEN
35 MP_TAC(SPEC `&1 / &2` REAL_EXP_BOUND_LEMMA) THEN REAL_ARITH_TAC);;
37 let DECREASING_LOG_OVER_N = prove
38 (`!n. 4 <= n ==> log(&n + &1) / (&n + &1) <= log(&n) / &n`,
39 REWRITE_TAC[GSYM REAL_OF_NUM_LE] THEN REPEAT STRIP_TAC THEN
40 MP_TAC(ISPECL [`\z. clog z / z`; `\z. (Cx(&1) - clog(z)) / z pow 2`;
41 `Cx(&n)`; `Cx(&n + &1)`] COMPLEX_MVT_LINE) THEN
42 REWRITE_TAC[IN_SEGMENT_CX_GEN] THEN
43 REWRITE_TAC[REAL_ARITH `~(n + &1 <= x /\ x <= n)`] THEN ANTS_TAC THENL
44 [X_GEN_TAC `w:complex` THEN STRIP_TAC THEN COMPLEX_DIFF_TAC THEN
45 SUBGOAL_THEN `&0 < Re w` MP_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
46 ASM_CASES_TAC `w = Cx(&0)` THEN ASM_SIMP_TAC[RE_CX; REAL_LT_REFL] THEN
47 DISCH_TAC THEN UNDISCH_TAC `~(w = Cx(&0))` THEN CONV_TAC COMPLEX_FIELD;
48 DISCH_THEN(X_CHOOSE_THEN `z:complex`
49 (CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC)) THEN
50 SUBGOAL_THEN `&0 < &n /\ &0 < &n + &1` STRIP_ASSUME_TAC THENL
51 [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
52 ASM_SIMP_TAC[GSYM CX_LOG; GSYM CX_DIV; RE_CX; GSYM CX_SUB] THEN
53 MATCH_MP_TAC(REAL_ARITH `&0 <= --x ==> a - b = x ==> a <= b`) THEN
54 REWRITE_TAC[RE_MUL_CX; GSYM REAL_MUL_LNEG] THEN
55 MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL [ALL_TAC; REAL_ARITH_TAC] THEN
56 SUBGOAL_THEN `?u. z = Cx(u)` (CHOOSE_THEN SUBST_ALL_TAC) THENL
57 [ASM_MESON_TAC[REAL; real]; ALL_TAC] THEN
58 RULE_ASSUM_TAC(REWRITE_RULE[IM_CX; RE_CX]) THEN
59 UNDISCH_THEN `T` (K ALL_TAC) THEN
60 SUBGOAL_THEN `&0 < u` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
61 ASM_SIMP_TAC[GSYM CX_LOG; GSYM CX_SUB; GSYM CX_POW; GSYM CX_DIV; RE_CX;
62 real_div; GSYM REAL_MUL_LNEG; REAL_NEG_SUB; GSYM REAL_POW_INV] THEN
63 MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_POW_2; REAL_LE_SQUARE] THEN
64 REWRITE_TAC[REAL_SUB_LE] THEN
65 GEN_REWRITE_TAC LAND_CONV [GSYM LOG_EXP] THEN
66 MATCH_MP_TAC LOG_MONO_LE_IMP THEN REWRITE_TAC[REAL_EXP_POS_LT] THEN
67 MP_TAC REAL_EXP_1_LE_4 THEN ASM_REAL_ARITH_TAC]);;
69 (* ------------------------------------------------------------------------- *)
70 (* An ad-hoc fact about complex n'th roots. *)
71 (* ------------------------------------------------------------------------- *)
73 let EXISTS_COMPLEX_ROOT_NONTRIVIAL = prove
74 (`!a n. 2 <= n ==> ?z. z pow n = a /\ ~(z = Cx(&1))`,
76 FIRST_ASSUM(ASSUME_TAC o MATCH_MP(ARITH_RULE `2 <= n ==> ~(n = 0)`)) THEN
77 ASM_CASES_TAC `a = Cx(&0)` THENL
78 [EXISTS_TAC `Cx(&0)` THEN ASM_REWRITE_TAC[COMPLEX_POW_ZERO] THEN
79 CONV_TAC COMPLEX_RING;
81 ASM_CASES_TAC `a = Cx(&1)` THENL
82 [EXISTS_TAC `cexp(Cx(&2) * Cx pi * ii * Cx(&1 / &n))` THEN
83 ASM_SIMP_TAC[COMPLEX_ROOT_UNITY_EQ_1; DIVIDES_ONE;
84 ARITH_RULE `2 <= n ==> ~(n = 1)`; COMPLEX_ROOT_UNITY];
86 `(!x. ~Q x ==> ~P x) /\ (?x. P x) ==> (?x. P x /\ Q x)`) THEN
87 ASM_SIMP_TAC[COMPLEX_POW_ONE] THEN EXISTS_TAC `cexp(clog a / Cx(&n))` THEN
88 ASM_SIMP_TAC[GSYM CEXP_N; COMPLEX_DIV_LMUL; CX_INJ; REAL_OF_NUM_EQ] THEN
89 ASM_SIMP_TAC[CEXP_CLOG]]);;
91 (* ------------------------------------------------------------------------- *)
92 (* Definition of a Dirichlet character mod d. *)
93 (* ------------------------------------------------------------------------- *)
95 let dirichlet_character = new_definition
96 `dirichlet_character d (c:num->complex) <=>
97 (!n. c(n + d) = c(n)) /\
98 (!n. c(n) = Cx(&0) <=> ~coprime(n,d)) /\
99 (!m n. c(m * n) = c(m) * c(n))`;;
101 let DIRICHLET_CHARACTER_PERIODIC = prove
102 (`!d c n. dirichlet_character d c ==> c(n + d) = c(n)`,
103 SIMP_TAC[dirichlet_character]);;
105 let DIRICHLET_CHARACTER_EQ_0 = prove
106 (`!d c n. dirichlet_character d c ==> (c(n) = Cx(&0) <=> ~coprime(n,d))`,
107 SIMP_TAC[dirichlet_character]);;
109 let DIRICHLET_CHARACTER_MUL = prove
110 (`!d c m n. dirichlet_character d c ==> c(m * n) = c(m) * c(n)`,
111 SIMP_TAC[dirichlet_character]);;
113 let DIRICHLET_CHARACTER_EQ_1 = prove
114 (`!d c. dirichlet_character d c ==> c(1) = Cx(&1)`,
115 REPEAT STRIP_TAC THEN
116 FIRST_ASSUM(MP_TAC o MATCH_MP DIRICHLET_CHARACTER_MUL) THEN
117 DISCH_THEN(MP_TAC o repeat (SPEC `1`)) THEN CONV_TAC NUM_REDUCE_CONV THEN
118 REWRITE_TAC[COMPLEX_FIELD `a = a * a <=> a = Cx(&0) \/ a = Cx(&1)`] THEN
119 ASM_SIMP_TAC[DIRICHLET_CHARACTER_EQ_0] THEN
120 MESON_TAC[COPRIME_1; COPRIME_SYM]);;
122 let DIRICHLET_CHARACTER_POW = prove
123 (`!d c m n. dirichlet_character d c ==> c(m EXP n) = c(m) pow n`,
124 REPLICATE_TAC 3 GEN_TAC THEN REWRITE_TAC[RIGHT_FORALL_IMP_THM] THEN
125 DISCH_TAC THEN INDUCT_TAC THEN ASM_SIMP_TAC[EXP; complex_pow] THENL
126 [ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_1]; ALL_TAC] THEN
127 FIRST_ASSUM(fun th -> REWRITE_TAC[MATCH_MP DIRICHLET_CHARACTER_MUL th]) THEN
130 let DIRICHLET_CHARACTER_PERIODIC_GEN = prove
131 (`!d c m n. dirichlet_character d c ==> c(m * d + n) = c(n)`,
132 REWRITE_TAC[RIGHT_FORALL_IMP_THM] THEN
133 REPEAT GEN_TAC THEN DISCH_TAC THEN
134 INDUCT_TAC THEN REWRITE_TAC[ADD_CLAUSES; MULT_CLAUSES] THEN
136 FIRST_X_ASSUM(fun th -> GEN_REWRITE_TAC RAND_CONV [GSYM th]) THEN
137 ONCE_REWRITE_TAC[ARITH_RULE `(mk + d) + n:num = (mk + n) + d`] THEN
138 ASM_SIMP_TAC[DIRICHLET_CHARACTER_PERIODIC]);;
140 let DIRICHLET_CHARACTER_CONG = prove
142 dirichlet_character d c /\ (m == n) (mod d) ==> c(m) = c(n)`,
143 REWRITE_TAC[CONG_CASES] THEN REPEAT STRIP_TAC THEN
144 ASM_SIMP_TAC[DIRICHLET_CHARACTER_PERIODIC_GEN]);;
146 let DIRICHLET_CHARACTER_ROOT = prove
147 (`!d c n. dirichlet_character d c /\ coprime(d,n)
148 ==> c(n) pow phi(d) = Cx(&1)`,
149 REPEAT STRIP_TAC THEN
150 FIRST_ASSUM(SUBST1_TAC o GSYM o MATCH_MP DIRICHLET_CHARACTER_EQ_1) THEN
151 FIRST_ASSUM(fun th ->
152 REWRITE_TAC[GSYM(MATCH_MP DIRICHLET_CHARACTER_POW th)]) THEN
153 MATCH_MP_TAC DIRICHLET_CHARACTER_CONG THEN
154 EXISTS_TAC `d:num` THEN ASM_REWRITE_TAC[] THEN
155 MATCH_MP_TAC FERMAT_LITTLE THEN ASM_MESON_TAC[COPRIME_SYM]);;
157 let DIRICHLET_CHARACTER_NORM = prove
158 (`!d c n. dirichlet_character d c
159 ==> norm(c n) = if coprime(d,n) then &1 else &0`,
160 REPEAT STRIP_TAC THEN COND_CASES_TAC THENL
162 REWRITE_TAC[COMPLEX_NORM_ZERO] THEN
163 ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_0; COPRIME_SYM]] THEN
164 ASM_CASES_TAC `d = 0` THENL
165 [ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_1; COMPLEX_NORM_CX; REAL_ABS_NUM;
166 COPRIME_0; COPRIME_SYM];
168 MP_TAC(SPECL [`d:num`; `c:num->complex`; `n:num`]
169 DIRICHLET_CHARACTER_ROOT) THEN ASM_REWRITE_TAC[] THEN
170 DISCH_THEN(MP_TAC o AP_TERM `norm:complex->real`) THEN
171 REWRITE_TAC[COMPLEX_NORM_POW; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
173 MP_TAC(SPECL [`norm((c:num->complex) n)`; `phi d`] REAL_POW_EQ_1_IMP) THEN
174 ASM_REWRITE_TAC[REAL_ABS_NORM] THEN
175 ASM_MESON_TAC[PHI_LOWERBOUND_1_STRONG; LE_1]);;
177 (* ------------------------------------------------------------------------- *)
178 (* The principal character mod d. *)
179 (* ------------------------------------------------------------------------- *)
181 let chi_0 = new_definition
182 `chi_0 d n = if coprime(n,d) then Cx(&1) else Cx(&0)`;;
184 let DIRICHLET_CHARACTER_CHI_0 = prove
185 (`dirichlet_character d (chi_0 d)`,
186 REWRITE_TAC[dirichlet_character; chi_0] THEN
187 REWRITE_TAC[NUMBER_RULE `coprime(n + d,d) <=> coprime(n,d)`;
188 NUMBER_RULE `coprime(m * n,d) <=> coprime(m,d) /\ coprime(n,d)`] THEN
189 CONV_TAC COMPLEX_RING);;
191 let DIRICHLET_CHARACTER_EQ_PRINCIPAL = prove
192 (`!d c. dirichlet_character d c
193 ==> (c = chi_0 d <=> !n. coprime(n,d) ==> c(n) = Cx(&1))`,
194 REPEAT STRIP_TAC THEN REWRITE_TAC[FUN_EQ_THM; chi_0] THEN
195 ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_0]);;
197 let DIRICHLET_CHARACTER_NONPRINCIPAL = prove
198 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
199 ==> ?n. coprime(n,d) /\ ~(c n = Cx(&0)) /\ ~(c n = Cx(&1))`,
200 MESON_TAC[DIRICHLET_CHARACTER_EQ_PRINCIPAL; DIRICHLET_CHARACTER_EQ_0]);;
202 let DIRICHLET_CHARACTER_0 = prove
203 (`!c. dirichlet_character 0 c <=> c = chi_0 0`,
204 GEN_TAC THEN EQ_TAC THEN SIMP_TAC[DIRICHLET_CHARACTER_CHI_0] THEN
205 DISCH_TAC THEN REWRITE_TAC[chi_0; FUN_EQ_THM; COPRIME_0] THEN
206 X_GEN_TAC `n:num` THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
207 ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_1; DIRICHLET_CHARACTER_EQ_0;
210 let DIRICHLET_CHARACTER_1 = prove
211 (`!c. dirichlet_character 1 c <=> !n. c n = Cx(&1)`,
212 GEN_TAC THEN REWRITE_TAC[dirichlet_character; COPRIME_1] THEN EQ_TAC THENL
214 FIRST_X_ASSUM(MP_TAC o SPECL [`1`; `1`]) THEN
215 ASM_REWRITE_TAC[ARITH; COMPLEX_RING
216 `x = x * x <=> x = Cx(&0) \/ x = Cx(&1)`] THEN
217 DISCH_TAC THEN INDUCT_TAC THEN ASM_REWRITE_TAC[ADD1] THEN
218 REPEAT(FIRST_X_ASSUM(MP_TAC o SPEC `0`)) THEN ASM_REWRITE_TAC[ARITH] THEN
219 CONV_TAC COMPLEX_RING;
220 DISCH_TAC THEN ASM_REWRITE_TAC[] THEN CONV_TAC COMPLEX_RING]);;
222 let DIRICHLET_CHARACTER_NONPRINCIPAL_NONTRIVIAL = prove
223 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
224 ==> ~(d = 0) /\ ~(d = 1)`,
225 REPEAT GEN_TAC THEN ASM_CASES_TAC `d = 0` THEN
226 ASM_REWRITE_TAC[DIRICHLET_CHARACTER_0; TAUT `~(p /\ ~p)`] THEN
227 ASM_CASES_TAC `d = 1` THEN
228 ASM_REWRITE_TAC[DIRICHLET_CHARACTER_1; chi_0; FUN_EQ_THM; COPRIME_1] THEN
231 let DIRICHLET_CHARACTER_ZEROSUM = prove
232 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
233 ==> vsum(1..d) c = Cx(&0)`,
234 REPEAT GEN_TAC THEN DISCH_TAC THEN
235 FIRST_ASSUM(STRIP_ASSUME_TAC o
236 MATCH_MP DIRICHLET_CHARACTER_NONPRINCIPAL_NONTRIVIAL) THEN
237 FIRST_ASSUM(MP_TAC o MATCH_MP DIRICHLET_CHARACTER_NONPRINCIPAL) THEN
238 DISCH_THEN(X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) THEN
239 MATCH_MP_TAC(COMPLEX_RING
240 `!x. x * c = c /\ ~(x = Cx(&1)) ==> c = Cx(&0)`) THEN
241 EXISTS_TAC `(c:num->complex) m` THEN
242 ASM_SIMP_TAC[GSYM VSUM_COMPLEX_LMUL; FINITE_NUMSEG] THEN
244 `!t. vsum t f = vsum s f /\ vsum t g = vsum s g /\ vsum t f = vsum t g
245 ==> vsum s f = vsum s g`) THEN
246 EXISTS_TAC `{n | coprime(n,d) /\ n < d}` THEN
247 REPEAT(CONJ_TAC THENL
248 [CONV_TAC SYM_CONV THEN MATCH_MP_TAC VSUM_SUPERSET THEN
249 SIMP_TAC[SUBSET; IN_NUMSEG; LT_IMP_LE; IN_ELIM_THM] THEN CONJ_TAC THEN
250 X_GEN_TAC `r:num` THENL
251 [ASM_CASES_TAC `r = 0` THENL [ALL_TAC; ASM_ARITH_TAC] THEN
252 ONCE_REWRITE_TAC[COPRIME_SYM] THEN ASM_REWRITE_TAC[COPRIME_0];
253 ASM_CASES_TAC `coprime(r,d)` THEN ASM_REWRITE_TAC[] THENL
254 [ASM_CASES_TAC `r:num = d` THEN ASM_REWRITE_TAC[LT_REFL] THENL
255 [ASM_MESON_TAC[COPRIME_REFL]; ASM_ARITH_TAC];
256 REWRITE_TAC[COMPLEX_VEC_0] THEN
257 ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_0; COMPLEX_MUL_RZERO]]];
259 FIRST_ASSUM(fun th ->
260 REWRITE_TAC[GSYM(MATCH_MP DIRICHLET_CHARACTER_MUL (CONJUNCT1 th))]) THEN
261 SIMP_TAC[VSUM; PHI_FINITE_LEMMA] THEN
262 MATCH_MP_TAC ITERATE_OVER_COPRIME THEN SIMP_TAC[MONOIDAL_VECTOR_ADD] THEN
263 ASM_MESON_TAC[DIRICHLET_CHARACTER_CONG]);;
265 let DIRICHLET_CHARACTER_ZEROSUM_MUL = prove
266 (`!d c n. dirichlet_character d c /\ ~(c = chi_0 d)
267 ==> vsum(1..d*n) c = Cx(&0)`,
268 REWRITE_TAC[RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN DISCH_TAC THEN
269 INDUCT_TAC THEN REWRITE_TAC[MULT_CLAUSES; VSUM_CLAUSES_NUMSEG] THEN
270 REWRITE_TAC[ARITH; COMPLEX_VEC_0] THEN ONCE_REWRITE_TAC[ADD_SYM] THEN
271 ASM_SIMP_TAC[VSUM_ADD_SPLIT; ARITH_RULE `1 <= n + 1`; COMPLEX_ADD_LID] THEN
272 ONCE_REWRITE_TAC[ADD_SYM] THEN REWRITE_TAC[VSUM_OFFSET] THEN
273 FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP DIRICHLET_CHARACTER_ZEROSUM) THEN
274 MATCH_MP_TAC VSUM_EQ THEN REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN
275 MATCH_MP_TAC DIRICHLET_CHARACTER_CONG THEN EXISTS_TAC `d:num` THEN
276 ASM_REWRITE_TAC[] THEN NUMBER_TAC);;
278 let DIRICHLET_CHARACTER_SUM_MOD = prove
279 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
280 ==> vsum(1..n) c = vsum(1..(n MOD d)) c`,
281 REPEAT GEN_TAC THEN DISCH_TAC THEN
282 FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP
283 DIRICHLET_CHARACTER_NONPRINCIPAL_NONTRIVIAL) THEN
284 FIRST_ASSUM(MP_TAC o SPEC `n:num` o MATCH_MP DIVISION) THEN
285 DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
286 DISCH_THEN(fun th -> GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [th]) THEN
287 SIMP_TAC[VSUM_ADD_SPLIT; ARITH_RULE `1 <= n + 1`] THEN
288 ONCE_REWRITE_TAC[MULT_SYM] THEN
289 ASM_SIMP_TAC[DIRICHLET_CHARACTER_ZEROSUM_MUL; COMPLEX_ADD_LID] THEN
290 ONCE_REWRITE_TAC[ADD_SYM] THEN REWRITE_TAC[VSUM_OFFSET] THEN
291 FIRST_ASSUM(SUBST1_TAC o SYM o MATCH_MP DIRICHLET_CHARACTER_ZEROSUM) THEN
292 MATCH_MP_TAC VSUM_EQ THEN REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN
293 MATCH_MP_TAC DIRICHLET_CHARACTER_CONG THEN EXISTS_TAC `d:num` THEN
294 ASM_REWRITE_TAC[] THEN CONV_TAC NUMBER_RULE);;
296 (* ------------------------------------------------------------------------- *)
297 (* Finiteness of the set of characters (later we could get size = phi(d)). *)
298 (* ------------------------------------------------------------------------- *)
300 let FINITE_DIRICHLET_CHARACTERS = prove
301 (`!d. FINITE {c | dirichlet_character d c}`,
302 GEN_TAC THEN ASM_CASES_TAC `d = 0` THENL
303 [ASM_SIMP_TAC[DIRICHLET_CHARACTER_0; SET_RULE `{x | x = a} = {a}`] THEN
304 SIMP_TAC[FINITE_RULES];
306 MATCH_MP_TAC FINITE_SUBSET THEN
307 EXISTS_TAC `IMAGE (\c n. c(n MOD d))
308 {c | (!m. m IN {m | m < d}
309 ==> c(m) IN (Cx(&0) INSERT
310 {z | z pow (phi d) = Cx(&1)})) /\
311 (!m. ~(m IN {m | m < d})
312 ==> c(m) = Cx(&0))}` THEN
314 [MATCH_MP_TAC FINITE_IMAGE THEN MATCH_MP_TAC FINITE_FUNSPACE THEN
315 ASM_SIMP_TAC[FINITE_NUMSEG_LT; FINITE_INSERT] THEN
316 MATCH_MP_TAC FINITE_COMPLEX_ROOTS_UNITY THEN
317 ASM_SIMP_TAC[PHI_LOWERBOUND_1_STRONG; LE_1];
319 REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN X_GEN_TAC `c:num->complex` THEN
320 DISCH_TAC THEN REWRITE_TAC[IN_IMAGE; IN_ELIM_THM; IN_INSERT] THEN
321 EXISTS_TAC `\n:num. if n < d then c(n) else Cx(&0)` THEN
322 ASM_SIMP_TAC[DIVISION; FUN_EQ_THM] THEN CONJ_TAC THEN X_GEN_TAC `m:num` THENL
323 [MATCH_MP_TAC DIRICHLET_CHARACTER_CONG THEN EXISTS_TAC `d:num` THEN
324 ASM_MESON_TAC[CONG_MOD; CONG_SYM];
325 ASM_MESON_TAC[DIRICHLET_CHARACTER_ROOT; COPRIME_SYM;
326 DIRICHLET_CHARACTER_EQ_0]]);;
328 (* ------------------------------------------------------------------------- *)
329 (* Very basic group structure. *)
330 (* ------------------------------------------------------------------------- *)
332 let DIRICHLET_CHARACTER_MUL_CNJ = prove
333 (`!d c n. dirichlet_character d c /\ ~(c n = Cx(&0))
334 ==> cnj(c n) * c n = Cx(&1) /\ c n * cnj(c n) = Cx(&1)`,
335 REPEAT GEN_TAC THEN STRIP_TAC THEN
336 MATCH_MP_TAC(COMPLEX_FIELD
337 `inv z = w /\ ~(z = Cx(&0)) ==> w * z = Cx(&1) /\ z * w = Cx(&1)`) THEN
338 ASM_REWRITE_TAC[COMPLEX_INV_CNJ] THEN
339 FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM COMPLEX_NORM_NZ]) THEN
340 FIRST_ASSUM(fun th -> REWRITE_TAC[MATCH_MP DIRICHLET_CHARACTER_NORM th]) THEN
341 COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_LT_REFL; COMPLEX_POW_ONE] THEN
342 REWRITE_TAC[COMPLEX_DIV_1]);;
344 let DIRICHLET_CHARACTER_CNJ = prove
345 (`!d c. dirichlet_character d c ==> dirichlet_character d (\n. cnj(c n))`,
346 SIMP_TAC[dirichlet_character; CNJ_MUL; CNJ_EQ_CX]);;
348 let DIRICHLET_CHARACTER_GROUPMUL = prove
349 (`!d c1 c2. dirichlet_character d c1 /\ dirichlet_character d c2
350 ==> dirichlet_character d (\n. c1(n) * c2(n))`,
351 SIMP_TAC[dirichlet_character; COMPLEX_ENTIRE] THEN
352 REWRITE_TAC[COMPLEX_MUL_AC]);;
354 let DIRICHLET_CHARACTER_GROUPINV = prove
355 (`!d c. dirichlet_character d c ==> (\n. cnj(c n) * c n) = chi_0 d`,
356 REPEAT STRIP_TAC THEN REWRITE_TAC[chi_0; FUN_EQ_THM] THEN
357 REPEAT STRIP_TAC THEN COND_CASES_TAC THENL
358 [ASM_MESON_TAC[DIRICHLET_CHARACTER_MUL_CNJ; DIRICHLET_CHARACTER_EQ_0];
359 ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_0; COMPLEX_MUL_RZERO]]);;
361 (* ------------------------------------------------------------------------- *)
362 (* Orthogonality relations, a weak version of one first. *)
363 (* ------------------------------------------------------------------------- *)
365 let DIRICHLET_CHARACTER_SUM_OVER_NUMBERS = prove
366 (`!d c. dirichlet_character d c
367 ==> vsum (1..d) c = if c = chi_0 d then Cx(&(phi d)) else Cx(&0)`,
368 REPEAT STRIP_TAC THEN COND_CASES_TAC THEN
369 ASM_SIMP_TAC[DIRICHLET_CHARACTER_ZEROSUM] THEN
370 FIRST_X_ASSUM SUBST1_TAC THEN POP_ASSUM(K ALL_TAC) THEN
371 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [GSYM ETA_AX] THEN
372 REWRITE_TAC[chi_0] THEN
373 SIMP_TAC[GSYM VSUM_RESTRICT_SET; FINITE_NUMSEG; GSYM COMPLEX_VEC_0] THEN
374 SIMP_TAC[phi; VSUM_CONST; FINITE_RESTRICT; FINITE_NUMSEG] THEN
375 REWRITE_TAC[COMPLEX_CMUL; COMPLEX_MUL_RID] THEN
376 AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN
377 REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_NUMSEG] THEN
378 X_GEN_TAC `x:num` THEN ASM_CASES_TAC `coprime(x,d)` THEN
379 ASM_REWRITE_TAC[] THEN ARITH_TAC);;
381 let DIRICHLET_CHARACTER_SUM_OVER_CHARACTERS_WEAK = prove
382 (`!d n. vsum {c | dirichlet_character d c} (\x. x n) = Cx(&0) \/
383 coprime(n,d) /\ !c. dirichlet_character d c ==> c(n) = Cx(&1)`,
384 REPEAT GEN_TAC THEN ASM_CASES_TAC `coprime(n,d)` THENL
386 DISJ1_TAC THEN REWRITE_TAC[GSYM COMPLEX_VEC_0] THEN
387 MATCH_MP_TAC VSUM_EQ_0 THEN
388 ASM_SIMP_TAC[IN_ELIM_THM; COMPLEX_VEC_0; DIRICHLET_CHARACTER_EQ_0]] THEN
390 `!c'. dirichlet_character d c'
391 ==> vsum {c | dirichlet_character d c}
392 ((\c. c(n)) o (\c n. c'(n) * c(n))) =
393 vsum {c | dirichlet_character d c} (\c. c(n))`
396 SIMP_TAC[o_DEF; FINITE_DIRICHLET_CHARACTERS; VSUM_COMPLEX_LMUL] THEN
397 REWRITE_TAC[COMPLEX_RING `a * x = x <=> a = Cx(&1) \/ x = Cx(&0)`] THEN
398 ASM_MESON_TAC[]] THEN
399 REPEAT STRIP_TAC THEN MATCH_MP_TAC VSUM_INJECTION THEN
400 REWRITE_TAC[FINITE_DIRICHLET_CHARACTERS; IN_ELIM_THM] THEN
401 ASM_SIMP_TAC[DIRICHLET_CHARACTER_GROUPMUL] THEN
402 REPEAT STRIP_TAC THEN
403 FIRST_X_ASSUM(MP_TAC o AP_TERM `(\c n. cnj(c'(n:num)) * c n)`) THEN
404 REWRITE_TAC[FUN_EQ_THM] THEN DISCH_TAC THEN X_GEN_TAC `m:num` THEN
405 ASM_CASES_TAC `coprime(m,d)` THENL
406 [ALL_TAC; ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_0]] THEN
407 FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN
408 MATCH_MP_TAC(COMPLEX_RING
409 `a * b = Cx(&1) ==> a * b * x = a * b * y ==> x = y`) THEN
410 ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_0; DIRICHLET_CHARACTER_MUL_CNJ]);;
412 let DIRICHLET_CHARACTER_SUM_OVER_CHARACTERS_POS = prove
413 (`!d n. real(vsum {c | dirichlet_character d c} (\c. c n)) /\
414 &0 <= Re(vsum {c | dirichlet_character d c} (\c. c n))`,
415 MP_TAC DIRICHLET_CHARACTER_SUM_OVER_CHARACTERS_WEAK THEN
416 REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN
417 STRIP_TAC THEN ASM_REWRITE_TAC[REAL_CX; RE_CX; REAL_LE_REFL] THEN
419 [MATCH_MP_TAC REAL_VSUM;
420 SIMP_TAC[FINITE_DIRICHLET_CHARACTERS; RE_VSUM] THEN
421 MATCH_MP_TAC SUM_POS_LE] THEN
422 ASM_SIMP_TAC[FINITE_DIRICHLET_CHARACTERS; IN_ELIM_THM; REAL_CX; RE_CX] THEN
423 REWRITE_TAC[REAL_POS]);;
425 (* ------------------------------------------------------------------------- *)
426 (* A somewhat gruesome lemma about extending a character from a subgroup. *)
427 (* ------------------------------------------------------------------------- *)
429 let CHARACTER_EXTEND_FROM_SUBGROUP = prove
431 h SUBSET {x | x < d /\ coprime(x,d)} /\
433 (!x y. x IN h /\ y IN h ==> ((x * y) MOD d) IN h) /\
434 (!x. x IN h ==> ?y. y IN h /\ (x * y == 1) (mod d)) /\
435 (!x. x IN h ==> ~(f x = Cx(&0))) /\
436 (!x y. x IN h /\ y IN h
437 ==> f((x * y) MOD d) = f(x) * f(y)) /\
438 a IN {x | x < d /\ coprime(x,d)} DIFF h
439 ==> ?f' h'. (a INSERT h) SUBSET h' /\
440 h' SUBSET {x | x < d /\ coprime(x,d)} /\
441 (!x. x IN h ==> f'(x) = f(x)) /\
444 (!x y. x IN h' /\ y IN h' ==> ((x * y) MOD d) IN h') /\
445 (!x. x IN h' ==> ?y. y IN h' /\ (x * y == 1) (mod d)) /\
446 (!x. x IN h' ==> ~(f' x = Cx(&0))) /\
447 (!x y. x IN h' /\ y IN h'
448 ==> f'((x * y) MOD d) = f'(x) * f'(y))`,
449 REWRITE_TAC[IN_ELIM_THM; IN_DIFF; SUBSET] THEN REPEAT STRIP_TAC THEN
450 SUBGOAL_THEN `1 < d` ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
451 FIRST_ASSUM(ASSUME_TAC o MATCH_MP LT_IMP_LE) THEN
452 SUBGOAL_THEN `?m x. 0 < m /\ x IN h /\ (a EXP m == x) (mod d)` MP_TAC THENL
453 [MAP_EVERY EXISTS_TAC [`phi d`; `1`] THEN ASM_REWRITE_TAC[] THEN
454 CONJ_TAC THENL [ASM_MESON_TAC[PHI_LOWERBOUND_1_STRONG; LE_1]; ALL_TAC] THEN
455 MATCH_MP_TAC FERMAT_LITTLE THEN ASM SET_TAC[];
457 SUBGOAL_THEN `!x s. x IN h ==> ((x EXP s) MOD d) IN h` ASSUME_TAC THENL
458 [REWRITE_TAC[RIGHT_FORALL_IMP_THM] THEN GEN_TAC THEN DISCH_TAC THEN
459 INDUCT_TAC THEN ASM_SIMP_TAC[EXP; MOD_LT] THEN
460 SUBGOAL_THEN `((x * (x EXP s) MOD d) MOD d) IN h` MP_TAC THEN
461 ASM_MESON_TAC[MOD_MULT_RMOD; ASSUME `1 <= d`; LE_1];
463 GEN_REWRITE_TAC LAND_CONV [num_WOP] THEN
464 DISCH_THEN(X_CHOOSE_THEN `m:num` MP_TAC) THEN
465 DISCH_THEN(CONJUNCTS_THEN2
466 (X_CHOOSE_THEN `am:num` STRIP_ASSUME_TAC) MP_TAC) THEN
467 FIRST_ASSUM(DISJ_CASES_TAC o MATCH_MP (ARITH_RULE
468 `0 < m ==> m = 1 \/ 2 <= m`))
470 [FIRST_X_ASSUM SUBST_ALL_TAC THEN UNDISCH_TAC `(a EXP 1 == am) (mod d)` THEN
471 ASM_SIMP_TAC[EXP_1; GSYM CONG_MOD_LT; MOD_LT] THEN ASM_MESON_TAC[];
473 DISCH_THEN(MP_TAC o GEN `r:num` o SPEC `r MOD m`) THEN
474 ASM_SIMP_TAC[DIVISION; LE_1; NOT_EXISTS_THM] THEN
475 REWRITE_TAC[TAUT `~(a /\ b /\ c) <=> b /\ c ==> ~a`] THEN DISCH_TAC THEN
476 SUBGOAL_THEN `!r x. x IN h /\ (a EXP r == x) (mod d) ==> m divides r`
478 [REPEAT STRIP_TAC THEN ASM_SIMP_TAC[DIVIDES_MOD; LE_1] THEN
479 REWRITE_TAC[ARITH_RULE `n = 0 <=> ~(0 < n)`] THEN
480 FIRST_X_ASSUM MATCH_MP_TAC THEN
481 EXISTS_TAC `(a EXP (r MOD m)) MOD d` THEN
482 ASM_SIMP_TAC[CONG_RMOD; LE_1; CONG_REFL] THEN
483 UNDISCH_TAC `!x. x IN h ==> (?y. y IN h /\ (x * y == 1) (mod d))` THEN
484 DISCH_THEN(MP_TAC o SPEC `(a EXP (m * r DIV m)) MOD d`) THEN ANTS_TAC THENL
485 [REWRITE_TAC[GSYM EXP_EXP] THEN
487 `(a EXP m) EXP (r DIV m) MOD d = (am EXP (r DIV m)) MOD d`
488 (fun th -> ASM_SIMP_TAC[th]) THEN
489 ASM_SIMP_TAC[GSYM CONG; LE_1] THEN
490 ASM_SIMP_TAC[CONG_LMOD; CONG_EXP; LE_1];
492 DISCH_THEN(X_CHOOSE_THEN `y:num` STRIP_ASSUME_TAC) THEN
493 UNDISCH_TAC `(a EXP r == x) (mod d)` THEN
494 MP_TAC(SPECL [`r:num`; `m:num`] DIVISION) THEN ASM_SIMP_TAC[LE_1] THEN
496 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [th]) THEN
497 ONCE_REWRITE_TAC[MULT_SYM] THEN REWRITE_TAC[EXP_ADD] THEN
498 DISCH_THEN(MP_TAC o SPEC `y:num` o MATCH_MP
499 (NUMBER_RULE `!a. (x:num == y) (mod n) ==> (a * x == a * y) (mod n)`)) THEN
500 DISCH_THEN(MP_TAC o MATCH_MP (NUMBER_RULE
501 `(y * e * a == z) (mod n)
502 ==> (e * y == 1) (mod n) ==> (a == z) (mod n)`)) THEN
504 [MATCH_MP_TAC CONG_TRANS THEN
505 EXISTS_TAC `a EXP (m * r DIV m) MOD d * y` THEN
506 ASM_SIMP_TAC[CONG_MULT; CONG_REFL; CONG_RMOD; LE_1];
508 ASM_SIMP_TAC[CONG; LE_1];
510 MP_TAC(SPECL [`(f:num->complex) am`; `m:num`]
511 EXISTS_COMPLEX_ROOT_NONTRIVIAL) THEN ASM_SIMP_TAC[] THEN
512 DISCH_THEN(X_CHOOSE_THEN `z:complex` STRIP_ASSUME_TAC) THEN
514 `?g. !x k. x IN h ==> g((x * a EXP k) MOD d) = f(x) * z pow k`
516 [REWRITE_TAC[MESON[] `(?g. !x a. p x ==> g(f a x) = h a x) <=>
517 (?g. !y x a. p x /\ f a x = y ==> g y = h a x)`] THEN
518 REWRITE_TAC[GSYM SKOLEM_THM] THEN
520 `(!y. ?z. !x k. p x /\ f x k = y ==> z = g x k) <=>
521 (!x k x' k'. p x /\ p x' /\ f x k = f x' k' ==> g x k = g x' k')`] THEN
522 ONCE_REWRITE_TAC[MESON[]
523 `(!x k y j. P x k y j) <=> (!k j x y. P x k y j)`] THEN
524 MATCH_MP_TAC WLOG_LE THEN CONJ_TAC THENL [MESON_TAC[]; ALL_TAC] THEN
525 MAP_EVERY X_GEN_TAC [`k:num`; `j:num`] THEN DISCH_TAC THEN
526 MAP_EVERY X_GEN_TAC [`x:num`; `y:num`] THEN
527 ASM_SIMP_TAC[GSYM CONG; LE_1] THEN STRIP_TAC THEN
528 UNDISCH_TAC `k:num <= j` THEN REWRITE_TAC[LE_EXISTS] THEN
529 DISCH_THEN(X_CHOOSE_THEN `i:num` SUBST_ALL_TAC) THEN
530 ONCE_REWRITE_TAC[ADD_SYM] THEN
531 REWRITE_TAC[COMPLEX_POW_ADD; COMPLEX_MUL_ASSOC] THEN
532 AP_THM_TAC THEN AP_TERM_TAC THEN
533 SUBGOAL_THEN `m divides i` MP_TAC THENL
534 [FIRST_X_ASSUM MATCH_MP_TAC THEN
535 UNDISCH_TAC `!x. x IN h ==> (?y. y IN h /\ (x * y == 1) (mod d))` THEN
536 DISCH_THEN(MP_TAC o SPEC `y:num`) THEN ASM_REWRITE_TAC[] THEN
537 DISCH_THEN(X_CHOOSE_THEN `z:num` STRIP_ASSUME_TAC) THEN
538 EXISTS_TAC `(z * x) MOD d` THEN ASM_SIMP_TAC[CONG_RMOD; LE_1] THEN
539 MATCH_MP_TAC CONG_MULT_LCANCEL THEN EXISTS_TAC `y * a EXP k` THEN
540 REWRITE_TAC[COPRIME_LMUL] THEN
541 CONJ_TAC THENL [ASM_MESON_TAC[COPRIME_EXP; COPRIME_SYM]; ALL_TAC] THEN
542 UNDISCH_TAC `(x * a EXP k == y * a EXP (k + i)) (mod d)` THEN
543 REWRITE_TAC[EXP_ADD] THEN UNDISCH_TAC `(y * z == 1) (mod d)` THEN
544 CONV_TAC NUMBER_RULE;
546 REWRITE_TAC[divides] THEN
547 DISCH_THEN(X_CHOOSE_THEN `r:num` SUBST_ALL_TAC) THEN
548 ASM_REWRITE_TAC[GSYM COMPLEX_POW_POW] THEN MATCH_MP_TAC EQ_TRANS THEN
549 EXISTS_TAC `f((y * (am EXP r) MOD d) MOD d):complex` THEN CONJ_TAC THENL
550 [AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN ASM_SIMP_TAC[CONG_MOD_LT] THEN
551 MATCH_MP_TAC CONG_TRANS THEN
552 EXISTS_TAC `y * (a EXP m) EXP r` THEN CONJ_TAC THENL
553 [MATCH_MP_TAC CONG_MULT THEN
554 ASM_SIMP_TAC[CONG_MULT; CONG_LMOD; CONG_REFL; LE_1] THEN
555 MATCH_MP_TAC CONG_EXP THEN ASM_MESON_TAC[CONG_SYM];
557 MATCH_MP_TAC CONG_MULT_LCANCEL THEN EXISTS_TAC `a EXP k` THEN
558 CONJ_TAC THENL [ASM_MESON_TAC[COPRIME_EXP; COPRIME_SYM]; ALL_TAC] THEN
559 UNDISCH_TAC `(x * a EXP k == y * a EXP (k + m * r)) (mod d)` THEN
560 REWRITE_TAC[EXP_ADD; EXP_EXP] THEN CONV_TAC NUMBER_RULE;
562 ASM_SIMP_TAC[] THEN AP_TERM_TAC THEN
563 SPEC_TAC(`r:num`,`s:num`) THEN INDUCT_TAC THEN
564 ASM_SIMP_TAC[EXP; MOD_LT; complex_pow; COMPLEX_MUL_RID] THENL
566 `!x y. x IN h /\ y IN h ==> f ((x * y) MOD d):complex = f x * f y` THEN
567 DISCH_THEN(MP_TAC o SPECL [`1`; `1`]) THEN
568 ASM_SIMP_TAC[MULT_CLAUSES; MOD_LT] THEN
569 UNDISCH_TAC `!x:num. x IN h ==> ~(f x = Cx (&0))` THEN
570 DISCH_THEN(MP_TAC o SPEC `1`) THEN ASM_REWRITE_TAC[] THEN
571 CONV_TAC COMPLEX_RING;
573 MATCH_MP_TAC EQ_TRANS THEN
574 EXISTS_TAC `f((am * (am EXP s) MOD d) MOD d):complex` THEN CONJ_TAC THENL
575 [ALL_TAC; ASM_SIMP_TAC[]] THEN
576 AP_TERM_TAC THEN ASM_SIMP_TAC[MOD_MULT_RMOD; ASSUME `1 <= d`; LE_1];
578 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `g:num->complex` THEN
579 DISCH_THEN (LABEL_TAC "*") THEN
580 EXISTS_TAC `{(x * a EXP k) MOD d | x IN h /\ k IN (:num)}` THEN
581 REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL
582 [REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INSERT; IN_UNIV] THEN
583 X_GEN_TAC `x:num` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THENL
584 [MAP_EVERY EXISTS_TAC [`1`; `1`];
585 MAP_EVERY EXISTS_TAC [`x:num`; `0`]] THEN
586 ASM_SIMP_TAC[EXP_1; MULT_CLAUSES; EXP; MOD_LT];
587 REWRITE_TAC[IN_ELIM_THM; LEFT_IMP_EXISTS_THM] THEN
588 MAP_EVERY X_GEN_TAC [`y:num`; `x:num`; `k:num`] THEN
589 STRIP_TAC THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN
590 ASM_SIMP_TAC[DIVISION; LE_1; COPRIME_MOD; COPRIME_LMUL] THEN
591 ASM_MESON_TAC[COPRIME_EXP; COPRIME_SYM];
592 X_GEN_TAC `x:num` THEN DISCH_TAC THEN
593 REMOVE_THEN "*" (MP_TAC o SPECL [`x:num`; `0`]) THEN
594 ASM_SIMP_TAC[MOD_LT; EXP; MULT_CLAUSES; complex_pow; COMPLEX_MUL_RID];
595 REMOVE_THEN "*" (MP_TAC o SPECL [`1`; `1`]) THEN
596 ASM_SIMP_TAC[EXP_1; MULT_CLAUSES; MOD_LT; COMPLEX_POW_1] THEN
597 UNDISCH_TAC `!x y. x IN h /\ y IN h ==> f ((x * y) MOD d) = f x * f y` THEN
598 DISCH_THEN(MP_TAC o SPECL [`1`; `1`]) THEN
599 ASM_SIMP_TAC[MULT_CLAUSES; MOD_LT] THEN
600 UNDISCH_TAC `~(z = Cx(&1))` THEN CONV_TAC COMPLEX_RING;
601 REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN
602 MAP_EVERY EXISTS_TAC [`1`; `0`] THEN
603 ASM_SIMP_TAC[EXP; MULT_CLAUSES; MOD_LT];
604 REWRITE_TAC[IN_ELIM_THM; IN_UNIV; LEFT_AND_EXISTS_THM] THEN
605 REWRITE_TAC[RIGHT_AND_EXISTS_THM; LEFT_IMP_EXISTS_THM] THEN
607 [`r:num`; `s:num`; `x:num`; `k:num`; `y:num`; `j:num`] THEN
608 STRIP_TAC THEN REPEAT(FIRST_X_ASSUM SUBST_ALL_TAC) THEN
609 MAP_EVERY EXISTS_TAC [`(x * y) MOD d`; `j + k:num`] THEN
610 ASM_SIMP_TAC[MOD_MULT_LMOD; MOD_MULT_RMOD; LE_1] THEN
611 REWRITE_TAC[EXP_ADD; MULT_AC];
612 REWRITE_TAC[IN_ELIM_THM; IN_UNIV; LEFT_IMP_EXISTS_THM] THEN
613 MAP_EVERY X_GEN_TAC [`y:num`; `x:num`; `k:num`] THEN
614 STRIP_TAC THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN
615 UNDISCH_TAC `!x. x IN h ==> (?y. y IN h /\ (x * y == 1) (mod d))` THEN
616 DISCH_THEN(MP_TAC o SPEC `x:num`) THEN ASM_REWRITE_TAC[] THEN
617 DISCH_THEN(X_CHOOSE_THEN `z:num` STRIP_ASSUME_TAC) THEN
618 EXISTS_TAC `(z * a EXP ((phi d - 1) * k)) MOD d` THEN
619 REWRITE_TAC[LEFT_EXISTS_AND_THM] THEN
620 CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN
621 MATCH_MP_TAC CONG_TRANS THEN
622 EXISTS_TAC `(x * a EXP k) * (z * a EXP ((phi d - 1) * k))` THEN
624 [MATCH_MP_TAC CONG_MULT THEN ASM_SIMP_TAC[CONG_MOD; LE_1]; ALL_TAC] THEN
625 ONCE_REWRITE_TAC[ARITH_RULE
626 `(x * a) * (z * ak):num = (x * z) * (a * ak)`] THEN
627 GEN_REWRITE_TAC (LAND_CONV) [ARITH_RULE `1 = 1 * 1`] THEN
628 MATCH_MP_TAC CONG_MULT THEN ASM_REWRITE_TAC[] THEN
629 REWRITE_TAC[GSYM EXP_ADD] THEN
630 SUBGOAL_THEN `k + (phi d - 1) * k = phi(d) * k` SUBST1_TAC THENL
631 [REWRITE_TAC[ARITH_RULE `k + a * k = (a + 1) * k`] THEN
632 AP_THM_TAC THEN AP_TERM_TAC THEN
633 ASM_SIMP_TAC[SUB_ADD; PHI_LOWERBOUND_1_STRONG];
635 REWRITE_TAC[GSYM EXP_EXP] THEN SUBST1_TAC(SYM(SPEC `k:num` EXP_ONE)) THEN
636 MATCH_MP_TAC CONG_EXP THEN ASM_SIMP_TAC[FERMAT_LITTLE];
637 REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN
638 ASM_SIMP_TAC[COMPLEX_ENTIRE; COMPLEX_POW_EQ_0] THEN
639 UNDISCH_TAC `!x:num. x IN h ==> ~(f x = Cx (&0))` THEN
640 DISCH_THEN(MP_TAC o SPEC `am:num`) THEN ASM_REWRITE_TAC[] THEN
641 SUBST1_TAC(SYM(ASSUME `z pow m = f(am:num)`)) THEN
642 REWRITE_TAC[COMPLEX_POW_EQ_0] THEN ASM_SIMP_TAC[LE_1];
643 REWRITE_TAC[IN_ELIM_THM; IN_UNIV; LEFT_AND_EXISTS_THM] THEN
644 REWRITE_TAC[RIGHT_AND_EXISTS_THM; LEFT_IMP_EXISTS_THM] THEN
646 [`r:num`; `s:num`; `x:num`; `k:num`; `y:num`; `j:num`] THEN
647 STRIP_TAC THEN REPEAT(FIRST_X_ASSUM SUBST_ALL_TAC) THEN
648 MATCH_MP_TAC EQ_TRANS THEN
649 EXISTS_TAC `g(((x * y) MOD d * a EXP (k + j)) MOD d):complex` THEN
651 [AP_TERM_TAC THEN ASM_SIMP_TAC[MOD_MULT_LMOD; MOD_MULT_RMOD; LE_1] THEN
652 REWRITE_TAC[EXP_ADD; MULT_AC];
654 ASM_SIMP_TAC[] THEN REWRITE_TAC[COMPLEX_POW_ADD; COMPLEX_MUL_AC]]);;
656 (* ------------------------------------------------------------------------- *)
657 (* Hence the key result that we can find a distinguishing character. *)
658 (* ------------------------------------------------------------------------- *)
660 let DIRICHLET_CHARACTER_DISCRIMINATOR = prove
661 (`!d n. 1 < d /\ ~((n == 1) (mod d))
662 ==> ?c. dirichlet_character d c /\ ~(c n = Cx(&1))`,
663 REPEAT STRIP_TAC THEN FIRST_ASSUM(ASSUME_TAC o MATCH_MP LT_IMP_LE) THEN
664 ASM_CASES_TAC `coprime(n,d)` THENL
666 EXISTS_TAC `chi_0 d` THEN
667 ASM_REWRITE_TAC[DIRICHLET_CHARACTER_CHI_0; chi_0] THEN
668 CONV_TAC COMPLEX_RING] THEN
669 MP_TAC(ISPECL [`\n:num. Cx(&1)`; `{1}`; `n MOD d`; `d:num`]
670 CHARACTER_EXTEND_FROM_SUBGROUP) THEN
671 ASM_SIMP_TAC[IN_SING; IN_ELIM_THM; IN_DIFF] THEN ANTS_TAC THENL
672 [ASM_SIMP_TAC[SUBSET; MULT_CLAUSES; MOD_LT; LE_1; IN_SING;
673 IN_ELIM_THM; DIVISION; COPRIME_MOD; CONG_MOD_LT;
674 COMPLEX_MUL_LID; CX_INJ; REAL_OF_NUM_EQ; ARITH] THEN
675 ASM_MESON_TAC[COPRIME_1; COPRIME_SYM; CONG_REFL];
677 REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
678 MAP_EVERY X_GEN_TAC [`f0:num->complex`; `h0:num->bool`] THEN
681 `!m. m <= CARD {x | x < d /\ coprime(x,d)}
682 ==> ?f h. h SUBSET {x | x < d /\ coprime(x,d)} /\
683 (1 IN h) /\ (n MOD d) IN h /\
684 (!x y. x IN h /\ y IN h ==> ((x * y) MOD d) IN h) /\
685 (!x. x IN h ==> ?y. y IN h /\ (x * y == 1) (mod d)) /\
686 ~(f(n MOD d) = Cx(&1)) /\
687 (!x. x IN h ==> ~(f x = Cx(&0))) /\
688 (!x y. x IN h /\ y IN h
689 ==> f((x * y) MOD d) = f(x) * f(y)) /\
692 [MATCH_MP_TAC num_WF THEN X_GEN_TAC `m:num` THEN
693 DISCH_THEN(LABEL_TAC "*") THEN DISCH_TAC THEN
694 ASM_CASES_TAC `m = 0` THENL
695 [MAP_EVERY EXISTS_TAC [`f0:num->complex`; `h0:num->bool`] THEN
696 ASM_REWRITE_TAC[LE_0] THEN ASM SET_TAC[];
698 FIRST_ASSUM(MP_TAC o C MATCH_MP
699 (MATCH_MP (ARITH_RULE `~(m = 0) ==> m - 1 < m`) (ASSUME `~(m = 0)`))) THEN
700 ASM_SIMP_TAC[ARITH_RULE `x <= n ==> x - 1 <= n`; LEFT_IMP_EXISTS_THM] THEN
701 MAP_EVERY X_GEN_TAC [`f:num->complex`; `h:num->bool`] THEN STRIP_TAC THEN
702 ASM_CASES_TAC `m <= CARD(h:num->bool)` THENL
703 [MAP_EVERY EXISTS_TAC [`f:num->complex`; `h:num->bool`] THEN
706 MP_TAC(ASSUME `h SUBSET {x | x < d /\ coprime (x,d)}`) THEN
707 DISCH_THEN(MP_TAC o MATCH_MP (SET_RULE
708 `s SUBSET t ==> ~(s = t) ==> ?a. a IN t /\ ~(a IN s)`)) THEN
709 ANTS_TAC THENL [ASM_MESON_TAC[]; REWRITE_TAC[IN_ELIM_THM]] THEN
710 DISCH_THEN(X_CHOOSE_THEN `a:num` STRIP_ASSUME_TAC) THEN
711 MP_TAC(ISPECL [`f:num->complex`; `h:num->bool`; `a:num`; `d:num`]
712 CHARACTER_EXTEND_FROM_SUBGROUP) THEN
713 ASM_REWRITE_TAC[IN_DIFF; IN_ELIM_THM] THEN
714 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `ff:num->complex` THEN
715 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `hh:num->bool` THEN
716 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
717 REPEAT(CONJ_TAC THENL [ASM SET_TAC[]; ALL_TAC]) THEN
718 MATCH_MP_TAC LE_TRANS THEN EXISTS_TAC `CARD((a:num) INSERT h)` THEN
719 SUBGOAL_THEN `FINITE(h:num->bool)` ASSUME_TAC THENL
720 [MATCH_MP_TAC FINITE_SUBSET THEN
721 EXISTS_TAC `{x | x IN {x | x < d} /\ coprime(x,d)}` THEN
722 SIMP_TAC[FINITE_RESTRICT; FINITE_NUMSEG_LT] THEN
723 ASM_REWRITE_TAC[IN_ELIM_THM];
726 [ASM_SIMP_TAC[CARD_CLAUSES] THEN
727 UNDISCH_TAC `m - 1 <= CARD(h:num->bool)` THEN ARITH_TAC;
728 MATCH_MP_TAC CARD_SUBSET THEN ASM_REWRITE_TAC[] THEN
729 MATCH_MP_TAC FINITE_SUBSET THEN
730 EXISTS_TAC `{x | x IN {x | x < d} /\ coprime(x,d)}` THEN
731 SIMP_TAC[FINITE_RESTRICT; FINITE_NUMSEG_LT] THEN
732 ASM_REWRITE_TAC[IN_ELIM_THM]];
734 DISCH_THEN(MP_TAC o SPEC `CARD {x | x < d /\ coprime(x,d)}`) THEN
735 REWRITE_TAC[LE_REFL] THEN REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN
736 MAP_EVERY X_GEN_TAC [`f:num->complex`; `h:num->bool`] THEN
737 ASM_CASES_TAC `h = {x | x < d /\ coprime (x,d)}` THENL
739 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
740 REWRITE_TAC[CONJ_ASSOC] THEN MATCH_MP_TAC(TAUT `~b ==> a /\ b ==> c`) THEN
741 REWRITE_TAC[NOT_LE] THEN MATCH_MP_TAC CARD_PSUBSET THEN
742 ASM_REWRITE_TAC[PSUBSET] THEN
743 MATCH_MP_TAC FINITE_SUBSET THEN EXISTS_TAC `{x:num | x < d}` THEN
744 SIMP_TAC[FINITE_RESTRICT; FINITE_NUMSEG_LT] THEN SET_TAC[]] THEN
745 FIRST_X_ASSUM SUBST_ALL_TAC THEN
746 REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN REWRITE_TAC[GSYM CONJ_ASSOC] THEN
748 EXISTS_TAC `\n. if coprime(n,d) then f(n MOD d) else Cx(&0)` THEN
749 ASM_REWRITE_TAC[] THEN REWRITE_TAC[dirichlet_character] THEN
750 REPEAT CONJ_TAC THEN X_GEN_TAC `x:num` THENL
751 [REWRITE_TAC[NUMBER_RULE `coprime(x + d:num,d) <=> coprime(x,d)`] THEN
752 COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN AP_TERM_TAC THEN
753 ASM_SIMP_TAC[GSYM CONG; LE_1] THEN CONV_TAC NUMBER_RULE;
754 COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
755 FIRST_X_ASSUM MATCH_MP_TAC THEN
756 ASM_SIMP_TAC[COPRIME_MOD; DIVISION; LE_1];
757 X_GEN_TAC `y:num` THEN REWRITE_TAC[COPRIME_LMUL] THEN
758 MAP_EVERY ASM_CASES_TAC [`coprime(x,d)`; `coprime(y,d)`] THEN
759 ASM_REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_MUL_RZERO] THEN
760 MATCH_MP_TAC EQ_TRANS THEN
761 EXISTS_TAC `f(((x MOD d) * (y MOD d)) MOD d):complex` THEN CONJ_TAC THENL
762 [AP_TERM_TAC THEN ASM_SIMP_TAC[MOD_MULT_MOD2; LE_1];
763 FIRST_X_ASSUM MATCH_MP_TAC THEN
764 ASM_SIMP_TAC[DIVISION; COPRIME_MOD; LE_1]]]);;
766 (* ------------------------------------------------------------------------- *)
767 (* Hence we get the full second orthogonality relation. *)
768 (* ------------------------------------------------------------------------- *)
770 let DIRICHLET_CHARACTER_SUM_OVER_CHARACTERS_INEXPLICIT = prove
771 (`!d n. vsum {c | dirichlet_character d c} (\c. c n) =
773 then Cx(&(CARD {c | dirichlet_character d c}))
776 ASM_CASES_TAC `d = 0` THENL
777 [ASM_REWRITE_TAC[CONG_MOD_0; DIRICHLET_CHARACTER_0; SET_RULE
778 `{x | x = a} = {a}`] THEN
779 SIMP_TAC[VSUM_CLAUSES; CARD_CLAUSES; FINITE_RULES; NOT_IN_EMPTY] THEN
780 REWRITE_TAC[chi_0; COPRIME_0; VECTOR_ADD_RID] THEN REWRITE_TAC[ARITH];
782 ASM_CASES_TAC `d = 1` THENL
783 [ASM_REWRITE_TAC[CONG_MOD_1; DIRICHLET_CHARACTER_1] THEN
784 REWRITE_TAC[GSYM FUN_EQ_THM; ETA_AX] THEN
785 ASM_REWRITE_TAC[SET_RULE `{x | x = a} = {a}`] THEN
786 SIMP_TAC[VSUM_CLAUSES; CARD_CLAUSES; FINITE_RULES; NOT_IN_EMPTY] THEN
787 REWRITE_TAC[VECTOR_ADD_RID; ARITH];
790 [MATCH_MP_TAC EQ_TRANS THEN
791 EXISTS_TAC `vsum {c | dirichlet_character d c} (\c. Cx(&1))` THEN
793 [MATCH_MP_TAC VSUM_EQ THEN REWRITE_TAC[IN_ELIM_THM] THEN
794 ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_1; DIRICHLET_CHARACTER_CONG];
795 SIMP_TAC[FINITE_DIRICHLET_CHARACTERS; VSUM_CONST] THEN
796 REWRITE_TAC[COMPLEX_CMUL; COMPLEX_MUL_RID]];
797 MP_TAC(SPECL [`d:num`; `n:num`]
798 DIRICHLET_CHARACTER_SUM_OVER_CHARACTERS_WEAK) THEN
799 ASM_MESON_TAC[DIRICHLET_CHARACTER_DISCRIMINATOR;
800 ARITH_RULE `~(d = 0) /\ ~(d = 1) ==> 1 < d`]]);;
802 let DIRICHLET_CHARACTER_SUM_OVER_CHARACTERS = prove
804 ==> vsum {c | dirichlet_character d c} (\c. c(n)) =
805 if (n == 1) (mod d) then Cx(&(phi d)) else Cx(&0)`,
806 REPEAT STRIP_TAC THEN
807 REWRITE_TAC[DIRICHLET_CHARACTER_SUM_OVER_CHARACTERS_INEXPLICIT] THEN
808 COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN
809 MP_TAC(ISPECL [`\c n. (c:num->complex) n`; `{c | dirichlet_character d c}`;
810 `1..d`;] VSUM_SWAP) THEN
811 SIMP_TAC[DIRICHLET_CHARACTER_SUM_OVER_CHARACTERS_INEXPLICIT;
812 DIRICHLET_CHARACTER_SUM_OVER_NUMBERS; FINITE_NUMSEG;
813 FINITE_DIRICHLET_CHARACTERS; ETA_AX] THEN
814 REWRITE_TAC[VSUM_DELTA; GSYM COMPLEX_VEC_0] THEN
815 REWRITE_TAC[IN_ELIM_THM; DIRICHLET_CHARACTER_CHI_0] THEN
816 DISCH_THEN SUBST1_TAC THEN
817 SIMP_TAC[GSYM VSUM_RESTRICT_SET; FINITE_NUMSEG] THEN
818 SUBGOAL_THEN `{j | j IN 1..d /\ (j == 1) (mod d)} = {1}`
819 (fun th -> SIMP_TAC[th; VSUM_SING]) THEN
820 REWRITE_TAC[EXTENSION; IN_SING; IN_ELIM_THM; IN_NUMSEG] THEN
821 X_GEN_TAC `k:num` THEN EQ_TAC THEN ASM_SIMP_TAC[LE_REFL; CONG_REFL] THEN
822 ASM_CASES_TAC `d = 1` THEN ASM_SIMP_TAC[CONG_MOD_1; LE_ANTISYM] THEN
823 ASM_CASES_TAC `k:num = d` THENL
824 [ASM_REWRITE_TAC[NUMBER_RULE `(d == 1) (mod d) <=> d divides 1`] THEN
825 ASM_REWRITE_TAC[DIVIDES_ONE];
826 STRIP_TAC THEN MATCH_MP_TAC CONG_IMP_EQ THEN EXISTS_TAC `d:num` THEN
827 ASM_REWRITE_TAC[LT_LE]]);;
829 (* ------------------------------------------------------------------------- *)
830 (* L-series, just at the point s = 1. *)
831 (* ------------------------------------------------------------------------- *)
833 let Lfunction_DEF = new_definition
834 `Lfunction c = infsum (from 1) (\n. c(n) / Cx(&n))`;;
836 let BOUNDED_LFUNCTION_PARTIAL_SUMS = prove
837 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
838 ==> bounded {vsum (1..n) c | n IN (:num)}`,
839 REPEAT GEN_TAC THEN DISCH_TAC THEN
840 FIRST_ASSUM(fun th ->
841 ONCE_REWRITE_TAC[MATCH_MP DIRICHLET_CHARACTER_SUM_MOD th]) THEN
842 MATCH_MP_TAC BOUNDED_SUBSET THEN
843 EXISTS_TAC `IMAGE (\n. vsum(1..n) c:complex) (0..d)` THEN
844 SIMP_TAC[FINITE_IMP_BOUNDED; FINITE_IMAGE; FINITE_NUMSEG] THEN
845 REWRITE_TAC[SIMPLE_IMAGE; SUBSET; FORALL_IN_IMAGE] THEN
846 X_GEN_TAC `n:num` THEN REWRITE_TAC[IN_UNIV; IN_IMAGE] THEN
847 EXISTS_TAC `n MOD d` THEN REWRITE_TAC[IN_NUMSEG; LE_0] THEN
848 ASM_MESON_TAC[LT_IMP_LE; DIVISION;
849 DIRICHLET_CHARACTER_NONPRINCIPAL_NONTRIVIAL]);;
851 let LFUNCTION = prove
852 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
853 ==> ((\n. c(n) / Cx(&n)) sums (Lfunction c)) (from 1)`,
854 REPEAT GEN_TAC THEN DISCH_TAC THEN SIMP_TAC[Lfunction_DEF; SUMS_INFSUM] THEN
855 REWRITE_TAC[complex_div] THEN MATCH_MP_TAC SERIES_DIRICHLET_COMPLEX THEN
856 REPEAT(EXISTS_TAC `1`) THEN FIRST_ASSUM(fun th ->
857 REWRITE_TAC[MATCH_MP BOUNDED_LFUNCTION_PARTIAL_SUMS th]) THEN
858 REWRITE_TAC[LIM_INV_N; GSYM CX_INV; REAL_CX; RE_CX] THEN
859 SIMP_TAC[REAL_LE_INV2; REAL_OF_NUM_LE; REAL_OF_NUM_LT; LE_1; LE_ADD]);;
861 (* ------------------------------------------------------------------------- *)
862 (* Other properties of conjugate characters. *)
863 (* ------------------------------------------------------------------------- *)
865 let CNJ_CHI_0 = prove
866 (`!d n. cnj(chi_0 d n) = chi_0 d n`,
867 REPEAT GEN_TAC THEN REWRITE_TAC[chi_0] THEN
868 COND_CASES_TAC THEN ASM_REWRITE_TAC[CNJ_CX]);;
870 let LFUNCTION_CNJ = prove
871 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
872 ==> Lfunction (\n. cnj(c n)) = cnj(Lfunction c)`,
873 REPEAT STRIP_TAC THEN REWRITE_TAC[Lfunction_DEF] THEN
874 MATCH_MP_TAC INFSUM_UNIQUE THEN
875 ONCE_REWRITE_TAC[GSYM CNJ_CX] THEN
876 REWRITE_TAC[GSYM CNJ_DIV] THEN
877 REWRITE_TAC[SUMS_CNJ; CNJ_CX; GSYM Lfunction_DEF] THEN
878 ASM_MESON_TAC[LFUNCTION]);;
880 (* ------------------------------------------------------------------------- *)
881 (* Explicit bound on truncating the Lseries. *)
882 (* ------------------------------------------------------------------------- *)
884 let LFUNCTION_PARTIAL_SUM = prove
885 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
888 ==> norm(Lfunction c - vsum(1..n) (\n. c(n) / Cx(&n)))
890 REPEAT GEN_TAC THEN DISCH_TAC THEN
891 MP_TAC(ISPECL [`c:num->complex`; `\n. inv(Cx(&n))`; `1`; `1`]
892 SERIES_DIRICHLET_COMPLEX_EXPLICIT) THEN
893 REWRITE_TAC[LE_REFL] THEN FIRST_ASSUM(fun th ->
894 REWRITE_TAC[MATCH_MP BOUNDED_LFUNCTION_PARTIAL_SUMS th]) THEN
895 REWRITE_TAC[LIM_INV_N; GSYM CX_INV; REAL_CX; RE_CX] THEN
896 SIMP_TAC[REAL_LE_INV2; REAL_OF_NUM_LE; REAL_OF_NUM_LT; LE_1; LE_ADD] THEN
897 REWRITE_TAC[REAL_LE_INV_EQ; REAL_POS] THEN
898 REWRITE_TAC[COMPLEX_NORM_CX; REAL_ABS_INV; REAL_ABS_NUM] THEN
899 REWRITE_TAC[CX_INV; GSYM complex_div; GSYM real_div] THEN
900 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `B:real` THEN
901 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `k:num` THEN DISCH_TAC THEN
902 MATCH_MP_TAC(ISPEC `sequentially` LIM_NORM_UBOUND) THEN
903 EXISTS_TAC `\n. vsum(k+1..n) (\n. c(n) / Cx(&n))` THEN
904 REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL
905 [FIRST_ASSUM(MP_TAC o MATCH_MP LFUNCTION) THEN
906 MP_TAC(ISPECL [`sequentially`; `vsum (1..k) (\n. c n / Cx (&n))`]
908 REWRITE_TAC[GSYM IMP_CONJ_ALT; sums; FROM_INTER_NUMSEG] THEN
909 DISCH_THEN(MP_TAC o MATCH_MP LIM_SUB) THEN
910 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] LIM_TRANSFORM) THEN
911 REWRITE_TAC[] THEN MATCH_MP_TAC LIM_EVENTUALLY THEN
912 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `k + 1` THEN
913 X_GEN_TAC `m:num` THEN DISCH_TAC THEN
914 FIRST_ASSUM(MP_TAC o MATCH_MP (ARITH_RULE `k + 1 <= m ==> k <= m`)) THEN
915 SIMP_TAC[LE_EXISTS; LEFT_IMP_EXISTS_THM] THEN
916 ASM_SIMP_TAC[VSUM_ADD_SPLIT; ARITH_RULE `1 <= k ==> 1 <= k + 1`] THEN
917 REPEAT STRIP_TAC THEN VECTOR_ARITH_TAC;
918 MATCH_MP_TAC ALWAYS_EVENTUALLY THEN
919 ASM_SIMP_TAC[ARITH_RULE `1 <= k + 1`; REAL_OF_NUM_ADD]]);;
921 let LFUNCTION_PARTIAL_SUM_STRONG = prove
922 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
924 !n. norm(Lfunction c - vsum(1..n) (\n. c(n) / Cx(&n)))
926 REPEAT GEN_TAC THEN DISCH_TAC THEN
927 FIRST_ASSUM(MP_TAC o MATCH_MP LFUNCTION_PARTIAL_SUM) THEN
928 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
929 EXISTS_TAC `max B (norm(Lfunction c))` THEN
930 ASM_SIMP_TAC[REAL_LT_MAX] THEN X_GEN_TAC `n:num` THEN
931 ASM_CASES_TAC `n = 0` THENL
932 [ASM_REWRITE_TAC[VSUM_CLAUSES_NUMSEG; VECTOR_SUB_RZERO; ARITH] THEN
934 FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_SIMP_TAC[LE_1] THEN
935 MATCH_MP_TAC(REAL_ARITH `a <= b ==> x <= a ==> x <= b`) THEN
936 ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_ARITH `&0 < &n + &1`] THEN
939 (* ------------------------------------------------------------------------- *)
940 (* First key bound, when the Lfunction is not zero (as indeed it isn't). *)
941 (* ------------------------------------------------------------------------- *)
943 let BOUNDED_LFUNCTION_DIRICHLET_MANGOLDT_LEMMA = prove
944 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
947 vsum(1..x) (\n. c(n) * Cx(mangoldt n / &n)) -
948 vsum(1..x) (\n. c(n) * Cx(log(&n) / &n)) | x IN (:num)}`,
949 REWRITE_TAC[BOUNDED_POS; SIMPLE_IMAGE; FORALL_IN_IMAGE; IN_UNIV] THEN
950 REPEAT STRIP_TAC THEN
951 SIMP_TAC[LOG_MANGOLDT_SUM; real_div; CX_MUL; GSYM VSUM_CX; FINITE_DIVISORS;
952 LE_1; GSYM VSUM_COMPLEX_LMUL; GSYM VSUM_COMPLEX_RMUL] THEN
953 REWRITE_TAC[VSUM_VSUM_DIVISORS] THEN
954 FIRST_ASSUM(fun th -> REWRITE_TAC[MATCH_MP DIRICHLET_CHARACTER_MUL th]) THEN
955 REWRITE_TAC[GSYM REAL_OF_NUM_MUL; COMPLEX_INV_MUL; CX_MUL; CX_INV] THEN
956 ONCE_REWRITE_TAC[COMPLEX_RING
957 `(ck * cn) * cm * k * n:complex = (ck * k) * (cn * cm * n)`] THEN
958 SIMP_TAC[VSUM_COMPLEX_RMUL; FINITE_NUMSEG] THEN
959 SIMP_TAC[GSYM VSUM_COMPLEX_LMUL; FINITE_NUMSEG] THEN
960 SIMP_TAC[GSYM VSUM_SUB; FINITE_NUMSEG] THEN
961 REWRITE_TAC[GSYM COMPLEX_SUB_RDISTRIB] THEN
962 MP_TAC(SPECL [`d:num`; `c:num->complex`] LFUNCTION_PARTIAL_SUM_STRONG) THEN
963 ASM_REWRITE_TAC[] THEN
964 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
965 EXISTS_TAC `&18 * B` THEN
966 ASM_SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
967 X_GEN_TAC `x:num` THEN MATCH_MP_TAC VSUM_NORM_TRIANGLE THEN
968 REWRITE_TAC[FINITE_NUMSEG; COMPLEX_NORM_MUL] THEN
969 REWRITE_TAC[COMPLEX_NORM_INV; COMPLEX_NORM_CX; REAL_ABS_NUM] THEN
970 REWRITE_TAC[GSYM real_div] THEN REWRITE_TAC[REAL_MUL_ASSOC] THEN
971 REWRITE_TAC[real_abs; MANGOLDT_POS_LE] THEN ASM_CASES_TAC `x = 0` THEN
972 ASM_SIMP_TAC[SUM_CLAUSES_NUMSEG; ARITH; REAL_LE_MUL; REAL_LT_IMP_LE;
973 REAL_OF_NUM_LT; ARITH] THEN
974 MATCH_MP_TAC REAL_LE_TRANS THEN
975 EXISTS_TAC `sum(1..x) (\n. B / &x * mangoldt n)` THEN CONJ_TAC THENL
977 REWRITE_TAC[SUM_LMUL] THEN
978 MATCH_MP_TAC REAL_LE_TRANS THEN
979 EXISTS_TAC `B / &x * &18 * &x` THEN CONJ_TAC THENL
980 [MATCH_MP_TAC REAL_LE_LMUL THEN
981 ASM_SIMP_TAC[REAL_LE_DIV; REAL_POS; REAL_LT_IMP_LE] THEN
982 REWRITE_TAC[REWRITE_RULE[ETA_AX] PSI_BOUND];
983 ASM_SIMP_TAC[REAL_FIELD `~(x = &0) ==> B / x * &18 * x = &18 * B`;
984 REAL_OF_NUM_EQ; REAL_LE_REFL]]] THEN
985 MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `n:num` THEN
986 STRIP_TAC THEN ASM_REWRITE_TAC[] THEN
987 FIRST_ASSUM(fun th -> REWRITE_TAC[MATCH_MP DIRICHLET_CHARACTER_NORM th]) THEN
989 ASM_SIMP_TAC[REAL_MUL_LZERO; REAL_MUL_RZERO; REAL_MUL_RID; REAL_LE_MUL;
990 REAL_LE_DIV; REAL_POS; REAL_LT_IMP_LE; MANGOLDT_POS_LE] THEN
991 REWRITE_TAC[real_div; REAL_ARITH `a * b * c <= d <=> (a * c) * b <= d`] THEN
992 MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[MANGOLDT_POS_LE] THEN
993 ASM_SIMP_TAC[GSYM real_div; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
994 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `B / (&(x DIV n) + &1)` THEN
995 ASM_REWRITE_TAC[GSYM complex_div] THEN
996 REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
997 ASM_SIMP_TAC[REAL_LE_LMUL_EQ] THEN
998 GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [GSYM REAL_INV_INV] THEN
999 ONCE_REWRITE_TAC[GSYM REAL_INV_MUL] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
1000 SUBGOAL_THEN `1 <= x` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
1001 ASM_SIMP_TAC[GSYM real_div; REAL_LT_DIV; REAL_OF_NUM_LT; LE_1] THEN
1002 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
1003 REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN
1004 MP_TAC(SPECL [`x:num`; `n:num`] DIVISION) THEN ASM_ARITH_TAC);;
1006 let SUMMABLE_CHARACTER_LOG_OVER_N = prove
1007 (`!c d. dirichlet_character d c /\ ~(c = chi_0 d)
1008 ==> summable (from 1) (\n. c(n) * Cx(log(&n) / &n))`,
1009 REPEAT GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC SERIES_DIRICHLET_COMPLEX THEN
1010 MAP_EVERY EXISTS_TAC [`4`; `1`] THEN REWRITE_TAC[REAL_CX] THEN
1011 FIRST_ASSUM(fun th ->
1012 REWRITE_TAC[MATCH_MP BOUNDED_LFUNCTION_PARTIAL_SUMS th]) THEN
1014 [SIMP_TAC[DECREASING_LOG_OVER_N; GSYM REAL_OF_NUM_ADD; RE_CX];
1015 MP_TAC LIM_LOG_OVER_N THEN
1016 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] LIM_TRANSFORM_EVENTUALLY) THEN
1017 REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN
1018 ASM_SIMP_TAC[CX_LOG; CX_DIV; LE_1; REAL_OF_NUM_LT]]);;
1020 let BOUNDED_LFUNCTION_DIRICHLET_MANGOLDT = prove
1021 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
1024 vsum(1..x) (\n. c(n) * Cx(mangoldt n / &n)) | x IN (:num)}`,
1025 REPEAT GEN_TAC THEN DISCH_TAC THEN
1026 FIRST_ASSUM(MP_TAC o
1027 MATCH_MP BOUNDED_LFUNCTION_DIRICHLET_MANGOLDT_LEMMA) THEN
1028 FIRST_ASSUM(MP_TAC o MATCH_MP SUMMABLE_CHARACTER_LOG_OVER_N) THEN
1029 DISCH_THEN(MP_TAC o MATCH_MP SUMMABLE_IMP_SUMS_BOUNDED) THEN
1030 REWRITE_TAC[IMP_IMP] THEN DISCH_THEN(MP_TAC o MATCH_MP BOUNDED_SUMS) THEN
1031 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] BOUNDED_SUBSET) THEN
1032 REWRITE_TAC[SIMPLE_IMAGE; SUBSET; FORALL_IN_IMAGE] THEN
1033 REWRITE_TAC[IN_UNIV; IN_ELIM_THM; RIGHT_EXISTS_AND_THM; EXISTS_IN_IMAGE;
1034 GSYM CONJ_ASSOC] THEN
1035 X_GEN_TAC `n:num` THEN REPEAT(EXISTS_TAC `n:num`) THEN VECTOR_ARITH_TAC);;
1037 let BOUNDED_DIRICHLET_MANGOLDT_NONZERO = prove
1039 dirichlet_character d c /\ ~(c = chi_0 d) /\ ~(Lfunction c = Cx(&0))
1040 ==> bounded { vsum(1..x) (\n. c n * Cx(mangoldt n / &n)) | x IN (:num)}`,
1041 REPEAT GEN_TAC THEN REWRITE_TAC[CONJ_ASSOC] THEN
1042 DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
1043 DISCH_THEN(MP_TAC o MATCH_MP BOUNDED_LFUNCTION_DIRICHLET_MANGOLDT) THEN
1044 REWRITE_TAC[BOUNDED_POS; SIMPLE_IMAGE; FORALL_IN_IMAGE; IN_UNIV] THEN
1045 REWRITE_TAC[COMPLEX_NORM_MUL] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
1046 ASM_SIMP_TAC[GSYM REAL_LE_RDIV_EQ; COMPLEX_NORM_NZ] THEN
1047 ASM_MESON_TAC[COMPLEX_NORM_NZ; REAL_LT_DIV]);;
1049 (* ------------------------------------------------------------------------- *)
1050 (* Now a bound when the Lfunction is zero (hypothetically). *)
1051 (* ------------------------------------------------------------------------- *)
1053 let MANGOLDT_LOG_SUM = prove
1055 ==> mangoldt(n) = --(sum {d | d divides n} (\d. mobius(d) * log(&d)))`,
1056 REPEAT STRIP_TAC THEN
1057 MP_TAC(ISPECL [`\n. mangoldt n`; `\n. log(&n)`] MOBIUS_INVERSION) THEN
1058 ASM_SIMP_TAC[LOG_MANGOLDT_SUM; LE_1] THEN DISCH_THEN(K ALL_TAC) THEN
1059 MATCH_MP_TAC EQ_TRANS THEN
1060 EXISTS_TAC `sum {d | d divides n} (\x. mobius x * (log(&n) - log(&x)))` THEN
1062 [MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `d:num` THEN
1063 REWRITE_TAC[IN_ELIM_THM; DIVIDES_DIV_MULT] THEN
1064 ABBREV_TAC `q = n DIV d` THEN
1065 MAP_EVERY ASM_CASES_TAC [`q = 0`; `d = 0`] THEN
1066 ASM_SIMP_TAC[MULT_CLAUSES; LE_1] THEN DISCH_THEN(SUBST_ALL_TAC o SYM) THEN
1067 ASM_SIMP_TAC[GSYM REAL_OF_NUM_MUL; LOG_MUL; REAL_OF_NUM_LT; LE_1] THEN
1069 ASM_SIMP_TAC[REAL_SUB_LDISTRIB; SUM_SUB; FINITE_DIVISORS; LE_1] THEN
1070 ASM_SIMP_TAC[SUM_RMUL; REWRITE_RULE[ETA_AX] DIVISORSUM_MOBIUS] THEN
1071 MATCH_MP_TAC(REAL_ARITH `a = &0 ==> a - b = --b`) THEN
1072 COND_CASES_TAC THEN ASM_REWRITE_TAC[LOG_1] THEN REAL_ARITH_TAC]);;
1074 let BOUNDED_DIRICHLET_MANGOLDT_LEMMA = prove
1076 dirichlet_character d c /\ ~(c = chi_0 d) /\ 1 <= x
1077 ==> Cx(log(&x)) + vsum (1..x) (\n. c(n) * Cx(mangoldt n / &n)) =
1078 vsum (1..x) (\n. c(n) / Cx(&n) *
1079 vsum {d | d divides n}
1080 (\d. Cx(mobius(d) * log(&x / &d))))`,
1081 REPEAT STRIP_TAC THEN ASM_SIMP_TAC[MANGOLDT_LOG_SUM] THEN
1082 MATCH_MP_TAC(COMPLEX_RING `c - b = a ==> (a:complex) + b = c`) THEN
1083 SIMP_TAC[GSYM VSUM_SUB; FINITE_NUMSEG] THEN
1084 SIMP_TAC[CX_NEG; CX_DIV; GSYM VSUM_CX; FINITE_NUMSEG; FINITE_DIVISORS;
1086 REWRITE_TAC[SIMPLE_COMPLEX_ARITH
1087 `c / d * x - c * --y / d:complex = c / d * (x + y)`] THEN
1088 SIMP_TAC[GSYM VSUM_ADD; FINITE_DIVISORS; LE_1] THEN
1089 MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
1091 (\n. c n / Cx(&n) * vsum {d | d divides n}
1092 (\d. Cx(mobius d * log(&x))))` THEN
1094 [MATCH_MP_TAC VSUM_EQ_NUMSEG THEN X_GEN_TAC `n:num` THEN STRIP_TAC THEN
1095 REWRITE_TAC[] THEN AP_TERM_TAC THEN MATCH_MP_TAC VSUM_EQ THEN
1096 X_GEN_TAC `m:num` THEN REWRITE_TAC[IN_ELIM_THM] THEN DISCH_TAC THEN
1097 REWRITE_TAC[CX_MUL; GSYM COMPLEX_ADD_LDISTRIB] THEN AP_TERM_TAC THEN
1098 REWRITE_TAC[GSYM CX_ADD; CX_INJ] THEN
1099 ASM_CASES_TAC `m = 0` THENL
1100 [ASM_MESON_TAC[DIVIDES_ZERO; LE_1]; ALL_TAC] THEN
1101 ASM_SIMP_TAC[LOG_DIV; REAL_OF_NUM_LT; LE_1] THEN REAL_ARITH_TAC;
1102 SIMP_TAC[FINITE_DIVISORS; CX_MUL; SUM_RMUL; LE_1; VSUM_CX] THEN
1103 SIMP_TAC[REWRITE_RULE[ETA_AX] DIVISORSUM_MOBIUS] THEN
1104 SIMP_TAC[COND_RAND; COND_RATOR; COMPLEX_MUL_LZERO; COMPLEX_MUL_RZERO] THEN
1105 ASM_SIMP_TAC[VSUM_DELTA; GSYM COMPLEX_VEC_0; IN_NUMSEG; LE_REFL] THEN
1106 MP_TAC(SPECL [`d:num`; `c:num->complex`] DIRICHLET_CHARACTER_EQ_1) THEN
1107 ASM_SIMP_TAC[COMPLEX_MUL_LID; COMPLEX_DIV_1]]);;
1109 let SUM_LOG_OVER_X_BOUND = prove
1110 (`!x. abs(sum(1..x) (\n. log(&x / &n) / &x)) <= &4`,
1111 X_GEN_TAC `x:num` THEN ASM_CASES_TAC `x = 0` THENL
1112 [ASM_SIMP_TAC[SUM_CLAUSES_NUMSEG; ARITH_EQ; REAL_ABS_NUM; REAL_POS];
1114 SIMP_TAC[real_div; SUM_RMUL; REAL_ABS_MUL; REAL_ABS_INV; REAL_ABS_NUM] THEN
1115 ASM_SIMP_TAC[GSYM real_div; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
1116 MATCH_MP_TAC REAL_LE_TRANS THEN
1117 EXISTS_TAC `sum (1..x) (\n. abs(log(&x / &n)))` THEN
1118 REWRITE_TAC[SUM_ABS_NUMSEG] THEN
1119 ASM_SIMP_TAC[real_abs; LOG_POS; REAL_LE_RDIV_EQ; REAL_OF_NUM_LT;
1120 LE_1; REAL_MUL_LID; REAL_OF_NUM_LE; LOG_DIV] THEN
1121 REWRITE_TAC[SUM_SUB_NUMSEG; GSYM LOG_FACT] THEN
1122 REWRITE_TAC[SUM_CONST_NUMSEG; ADD_SUB] THEN
1123 FIRST_ASSUM(MP_TAC o MATCH_MP LOG_FACT_BOUNDS) THEN
1124 MATCH_MP_TAC(REAL_ARITH
1125 `&2 * l + abs(x) + &1 <= b
1126 ==> abs(lf - (xl - x + &1)) <= &2 * l
1127 ==> xl - lf <= b`) THEN
1128 MATCH_MP_TAC(REAL_ARITH
1129 `&1 <= x /\ l <= x ==> &2 * l + abs(x) + &1 <= &4 * x`) THEN
1130 ASM_SIMP_TAC[REAL_OF_NUM_LE; LE_1; LOG_LE_REFL]);;
1132 let BOUNDED_DIRICHLET_MANGOLDT_ZERO = prove
1134 dirichlet_character d c /\ ~(c = chi_0 d) /\ Lfunction c = Cx(&0)
1135 ==> bounded { vsum(1..x) (\n. c n * Cx(mangoldt n / &n)) +
1136 Cx(log(&x)) | x IN (:num)}`,
1137 ONCE_REWRITE_TAC[COMPLEX_ADD_SYM] THEN REPEAT STRIP_TAC THEN
1138 MP_TAC(SPECL [`d:num`; `c:num->complex`] LFUNCTION_PARTIAL_SUM_STRONG) THEN
1139 ASM_REWRITE_TAC[COMPLEX_SUB_LZERO; NORM_NEG] THEN
1140 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
1141 SIMP_TAC[SET_RULE `{f x | x IN (:num)} = f 0 INSERT {f x | ~(x = 0)}`] THEN
1142 REWRITE_TAC[BOUNDED_INSERT; ARITH_RULE `~(n = 0) <=> 1 <= n`] THEN
1143 ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
1144 REWRITE_TAC[BOUNDED_POS; FORALL_IN_IMAGE; IN_ELIM_THM] THEN
1145 MP_TAC(SPECL [`d:num`; `c:num->complex`]
1146 BOUNDED_DIRICHLET_MANGOLDT_LEMMA) THEN
1147 ASM_SIMP_TAC[] THEN DISCH_THEN(K ALL_TAC) THEN
1148 SIMP_TAC[GSYM VSUM_COMPLEX_LMUL; FINITE_DIVISORS; LE_1] THEN
1149 REWRITE_TAC[VSUM_VSUM_DIVISORS] THEN
1150 FIRST_ASSUM(fun th -> REWRITE_TAC[MATCH_MP DIRICHLET_CHARACTER_MUL th]) THEN
1151 REWRITE_TAC[GSYM REAL_OF_NUM_MUL; CX_MUL; complex_div; COMPLEX_INV_MUL] THEN
1152 ONCE_REWRITE_TAC[COMPLEX_RING
1153 `((ck * cn) * k' * n') * m * l = (cn * m * n') * l * (ck * k')`] THEN
1154 REWRITE_TAC[GSYM complex_div] THEN
1155 SIMP_TAC[VSUM_COMPLEX_LMUL; FINITE_NUMSEG] THEN
1156 EXISTS_TAC `&4 * B` THEN
1157 ASM_SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
1158 X_GEN_TAC `x:num` THEN DISCH_TAC THEN MATCH_MP_TAC VSUM_NORM_TRIANGLE THEN
1159 REWRITE_TAC[FINITE_NUMSEG] THEN
1160 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC
1161 `sum(1..x) (\n. inv(&n) * log(&x / &n) * B / (&(x DIV n) + &1))` THEN
1163 [MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `n:num` THEN
1164 STRIP_TAC THEN REWRITE_TAC[] THEN ONCE_REWRITE_TAC[COMPLEX_NORM_MUL] THEN
1165 MATCH_MP_TAC REAL_LE_MUL2 THEN REWRITE_TAC[NORM_POS_LE] THEN CONJ_TAC THENL
1166 [REWRITE_TAC[COMPLEX_NORM_MUL; COMPLEX_NORM_DIV; COMPLEX_NORM_CX] THEN
1167 FIRST_ASSUM(fun t -> SIMP_TAC[MATCH_MP DIRICHLET_CHARACTER_NORM t]) THEN
1169 REWRITE_TAC[REAL_MUL_LZERO; REAL_LE_INV_EQ; REAL_POS] THEN
1170 REWRITE_TAC[REAL_MUL_LID; REAL_ABS_NUM] THEN
1171 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
1172 ASM_SIMP_TAC[REAL_FIELD `&1 <= n ==> inv(n) * n = &1`; REAL_OF_NUM_LE;
1174 SIMP_TAC[CX_LOG; REAL_LT_DIV; REAL_OF_NUM_LT; LE_1] THEN
1175 SIMP_TAC[COMPLEX_NORM_CX; COMPLEX_NORM_MUL] THEN
1176 MATCH_MP_TAC REAL_LE_MUL2 THEN SIMP_TAC[REAL_ABS_POS; NORM_POS_LE] THEN
1177 ASM_REWRITE_TAC[] THEN SIMP_TAC[REAL_ARITH `abs x <= x <=> &0 <= x`] THEN
1178 ASM_SIMP_TAC[LOG_POS; REAL_LE_RDIV_EQ; REAL_OF_NUM_LT; LE_1;
1179 REAL_MUL_LID; REAL_OF_NUM_LE]];
1181 SIMP_TAC[real_div; REAL_RING `a * l * B * i:real = ((l * i) * a) * B`] THEN
1182 REWRITE_TAC[SUM_RMUL] THEN ASM_SIMP_TAC[REAL_LE_RMUL_EQ] THEN
1183 MATCH_MP_TAC REAL_LE_TRANS THEN
1184 EXISTS_TAC `sum(1..x) (\n. log(&x / &n) / &x)` THEN
1185 ASM_SIMP_TAC[REAL_ARITH `abs x <= a ==> x <= a`; SUM_LOG_OVER_X_BOUND] THEN
1186 MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `n:num` THEN STRIP_TAC THEN
1187 REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
1188 MATCH_MP_TAC REAL_LE_LMUL THEN
1189 ASM_SIMP_TAC[GSYM real_div; LOG_POS; REAL_LE_RDIV_EQ; REAL_OF_NUM_LT;
1190 LE_1; REAL_MUL_LID; REAL_OF_NUM_LE] THEN
1191 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
1192 GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [GSYM REAL_INV_INV] THEN
1193 REWRITE_TAC[GSYM REAL_INV_MUL] THEN MATCH_MP_TAC REAL_LE_INV2 THEN
1194 ASM_SIMP_TAC[GSYM real_div; REAL_LT_DIV; REAL_OF_NUM_LT; LE_1] THEN
1195 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
1196 REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN
1197 MP_TAC(SPECL [`x:num`; `n:num`] DIVISION) THEN ASM_ARITH_TAC);;
1199 (* ------------------------------------------------------------------------- *)
1200 (* Now the analogous result for the principal character. *)
1201 (* ------------------------------------------------------------------------- *)
1203 let BOUNDED_DIRICHLET_MANGOLDT_PRINCIPAL_LEMMA = prove
1205 ==> norm(vsum(1..x) (\n. (chi_0 d n - Cx(&1)) * Cx(mangoldt n / &n)))
1206 <= sum {p | prime p /\ p divides d} (\p. log(&p))`,
1207 REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN
1208 EXISTS_TAC `sum {p | prime p /\ p divides d}
1209 (\p. sum {k | 1 <= k /\ p EXP k <= x}
1210 (\k. log(&p) / &p pow k))` THEN
1213 MATCH_MP_TAC SUM_LE THEN ASM_SIMP_TAC[FINITE_SPECIAL_DIVISORS; LE_1] THEN
1214 X_GEN_TAC `p:num` THEN REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN
1215 SUBGOAL_THEN `2 <= p /\ 1 <= p /\ 1 < p` ASSUME_TAC THENL
1216 [ASM_MESON_TAC[PRIME_GE_2; ARITH_RULE `2 <= p ==> 1 < p /\ 1 <= p`];
1218 MATCH_MP_TAC REAL_LE_TRANS THEN
1219 EXISTS_TAC `sum(1..x) (\k. log(&p) / &p pow k)` THEN CONJ_TAC THENL
1220 [MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN REWRITE_TAC[FINITE_NUMSEG] THEN
1221 ASM_SIMP_TAC[IN_DIFF; IN_NUMSEG; IN_ELIM_THM; SUBSET; REAL_POW_LE;
1222 REAL_POS; REAL_LE_DIV; LOG_POS; REAL_OF_NUM_LE;
1223 PRIME_GE_2; ARITH_RULE `2 <= p ==> 1 <= p`] THEN
1224 X_GEN_TAC `k:num` THEN STRIP_TAC THEN
1225 MATCH_MP_TAC LE_TRANS THEN EXISTS_TAC `p EXP k` THEN
1226 ASM_REWRITE_TAC[] THEN
1227 MATCH_MP_TAC LE_TRANS THEN EXISTS_TAC `2 EXP k` THEN
1228 ASM_SIMP_TAC[LT_POW2_REFL; LT_IMP_LE; EXP_MONO_LE];
1229 REWRITE_TAC[real_div; SUM_LMUL] THEN
1230 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
1231 ASM_SIMP_TAC[REAL_LE_LMUL_EQ; LOG_POS_LT; REAL_OF_NUM_LT] THEN
1232 SIMP_TAC[GSYM REAL_POW_INV; SUM_GP; REAL_INV_EQ_1; REAL_OF_NUM_EQ] THEN
1233 COND_CASES_TAC THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
1234 COND_CASES_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN
1235 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_SUB_LT; REAL_LT_LDIV_EQ;
1236 REAL_MUL_LID; REAL_OF_NUM_LT; LE_1] THEN
1237 REWRITE_TAC[real_pow] THEN
1238 MATCH_MP_TAC(REAL_ARITH `&0 <= x * y /\ &2 * x <= &1
1239 ==> x pow 1 - x * y <= &1 - x`) THEN
1240 ASM_SIMP_TAC[REAL_LE_DIV; REAL_POW_LE; REAL_POS; REAL_LE_MUL] THEN
1241 REWRITE_TAC[real_div; REAL_MUL_LID] THEN REWRITE_TAC[GSYM real_div] THEN
1242 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_MUL_LID; REAL_OF_NUM_LT;
1243 REAL_OF_NUM_LE; LE_1]]] THEN
1244 W(MP_TAC o PART_MATCH (lhs o rand) SUM_SUM_PRODUCT o rand o snd) THEN
1246 [ASM_SIMP_TAC[FINITE_SPECIAL_DIVISORS; LE_1] THEN
1247 X_GEN_TAC `p:num` THEN REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN
1248 MATCH_MP_TAC FINITE_SUBSET THEN EXISTS_TAC `1..x` THEN
1249 SIMP_TAC[SUBSET; FINITE_NUMSEG; IN_NUMSEG; IN_ELIM_THM] THEN
1250 X_GEN_TAC `k:num` THEN STRIP_TAC THEN
1251 MATCH_MP_TAC LE_TRANS THEN EXISTS_TAC `p EXP k` THEN
1252 ASM_REWRITE_TAC[] THEN
1253 MATCH_MP_TAC LE_TRANS THEN EXISTS_TAC `2 EXP k` THEN
1254 ASM_SIMP_TAC[LT_POW2_REFL; LT_IMP_LE; EXP_MONO_LE; PRIME_GE_2];
1256 DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC VSUM_NORM_TRIANGLE THEN
1257 REWRITE_TAC[FINITE_NUMSEG; COMPLEX_NORM_MUL; COMPLEX_NORM_CX] THEN
1258 REWRITE_TAC[chi_0; COND_RAND; COND_RATOR] THEN
1259 REWRITE_TAC[COMPLEX_SUB_REFL; COMPLEX_SUB_LZERO] THEN
1260 REWRITE_TAC[COMPLEX_NORM_CX; NORM_NEG; REAL_ABS_NUM] THEN
1261 REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_LID] THEN
1262 REWRITE_TAC[mangoldt; COND_RAND] THEN ONCE_REWRITE_TAC[COND_RATOR] THEN
1263 ONCE_REWRITE_TAC[COND_RAND] THEN
1264 REWRITE_TAC[real_div; REAL_MUL_LZERO; REAL_ABS_NUM] THEN
1265 REWRITE_TAC[TAUT `(if a then &0 else if b then x else &0) =
1266 (if ~a /\ b then x else &0)`] THEN
1267 SIMP_TAC[GSYM real_div; GSYM SUM_RESTRICT_SET; FINITE_NUMSEG] THEN
1268 MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN
1269 MATCH_MP_TAC SUM_EQ_GENERAL THEN EXISTS_TAC `\(p,k). p EXP k` THEN
1270 REWRITE_TAC[EXISTS_UNIQUE; EXISTS_PAIR_THM; FORALL_PAIR_THM] THEN
1271 REWRITE_TAC[IN_ELIM_PAIR_THM] THEN
1272 REWRITE_TAC[IN_ELIM_THM; IN_NUMSEG; PAIR_EQ] THEN CONJ_TAC THENL
1273 [X_GEN_TAC `y:num` THEN
1274 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC)) THEN
1275 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `p:num` THEN
1276 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `k:num` THEN
1277 STRIP_TAC THEN FIRST_X_ASSUM SUBST_ALL_TAC THEN
1278 UNDISCH_TAC `~(coprime(p EXP k,d))` THEN
1279 ASM_SIMP_TAC[ONCE_REWRITE_RULE[COPRIME_SYM] COPRIME_PRIMEPOW; LE_1] THEN
1280 DISCH_TAC THEN MAP_EVERY X_GEN_TAC [`q:num`; `j:num`] THEN
1281 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC)) THEN
1282 ASM_SIMP_TAC[EQ_PRIME_EXP] THEN ASM_ARITH_TAC;
1284 MAP_EVERY X_GEN_TAC [`p:num`; `k:num`] THEN
1285 ASM_SIMP_TAC[ONCE_REWRITE_RULE[COPRIME_SYM] COPRIME_PRIMEPOW; LE_1] THEN
1286 REPEAT STRIP_TAC THENL
1287 [ASM_MESON_TAC[EXP_EQ_0; LE_1; PRIME_0]; ASM_MESON_TAC[]; ALL_TAC] THEN
1288 REWRITE_TAC[GSYM REAL_OF_NUM_POW; REAL_ABS_DIV; REAL_ABS_POW;
1290 AP_THM_TAC THEN AP_TERM_TAC THEN
1291 MATCH_MP_TAC(REAL_ARITH `&0 <= y /\ x = y ==> abs x = y`) THEN
1292 ASM_SIMP_TAC[LOG_POS; REAL_OF_NUM_LE; PRIME_IMP_NZ; LE_1] THEN
1293 AP_TERM_TAC THEN AP_TERM_TAC THEN MATCH_MP_TAC SELECT_UNIQUE THEN
1294 X_GEN_TAC `q:num` THEN REWRITE_TAC[] THEN EQ_TAC THENL
1295 [ASM_MESON_TAC[PRIME_DIVEXP; DIVIDES_PRIME_PRIME];
1296 DISCH_THEN SUBST1_TAC THEN ASM_REWRITE_TAC[] THEN
1297 SUBGOAL_THEN `k = SUC(k - 1)` SUBST1_TAC THENL
1298 [ASM_ARITH_TAC; SIMP_TAC[EXP; DIVIDES_RMUL; DIVIDES_REFL]]]);;
1300 let BOUNDED_DIRICHLET_MANGOLDT_PRINCIPAL = prove
1302 ==> bounded { vsum(1..x) (\n. chi_0 d n * Cx(mangoldt n / &n)) -
1303 Cx(log(&x)) | x IN (:num)}`,
1304 REPEAT STRIP_TAC THEN
1305 REWRITE_TAC[bounded; SIMPLE_IMAGE; FORALL_IN_IMAGE; IN_UNIV] THEN
1307 `abs(sum {p | prime p /\ p divides d} (\p. log(&p))) +
1308 abs(log(&0)) + &21` THEN
1309 X_GEN_TAC `x:num` THEN ASM_CASES_TAC `x = 0` THENL
1310 [ASM_SIMP_TAC[VSUM_CLAUSES_NUMSEG; ARITH; VECTOR_SUB_LZERO] THEN
1311 REWRITE_TAC[NORM_NEG; COMPLEX_NORM_CX] THEN REAL_ARITH_TAC;
1313 MATCH_MP_TAC(REAL_ARITH `x <= a + b ==> x <= a + abs y + b`) THEN
1314 MATCH_MP_TAC(NORM_ARITH
1315 `!s'. norm(s') <= p /\ norm(s - s' - l) <= &21
1316 ==> norm(s - l) <= abs p + &21`) THEN
1317 EXISTS_TAC `vsum(1..x) (\n. (chi_0 d n - Cx(&1)) * Cx(mangoldt n / &n))` THEN
1318 ASM_SIMP_TAC[BOUNDED_DIRICHLET_MANGOLDT_PRINCIPAL_LEMMA] THEN
1319 SIMP_TAC[GSYM VSUM_SUB; FINITE_NUMSEG] THEN
1320 REWRITE_TAC[COMPLEX_RING `c * x - (c - Cx(&1)) * x = x`] THEN
1321 SIMP_TAC[GSYM CX_SUB; VSUM_CX; FINITE_NUMSEG; COMPLEX_NORM_CX] THEN
1322 MATCH_MP_TAC MERTENS_LEMMA THEN ASM_REWRITE_TAC[]);;
1324 (* ------------------------------------------------------------------------- *)
1325 (* The arithmetic-geometric mean that we want. *)
1326 (* ------------------------------------------------------------------------- *)
1328 let SUM_OF_NUMBERS = prove
1329 (`!n. nsum(0..n) (\i. i) = (n * (n + 1)) DIV 2`,
1330 INDUCT_TAC THEN ASM_REWRITE_TAC[NSUM_CLAUSES_NUMSEG] THEN ARITH_TAC);;
1332 let PRODUCT_POW_NSUM = prove
1333 (`!s. FINITE s ==> product s (\i. z pow (f i)) = z pow (nsum s f)`,
1334 MATCH_MP_TAC FINITE_INDUCT_STRONG THEN
1335 SIMP_TAC[PRODUCT_CLAUSES; NSUM_CLAUSES; real_pow; REAL_POW_ADD]);;
1337 let PRODUCT_SPECIAL = prove
1338 (`!z i. product (0..n) (\i. z pow i) = z pow ((n * (n + 1)) DIV 2)`,
1339 SIMP_TAC[PRODUCT_POW_NSUM; FINITE_NUMSEG; SUM_OF_NUMBERS]);;
1341 let AGM_SPECIAL = prove
1343 ==> (&n + &1) pow 2 * t pow n <= (sum(0..n) (\k. t pow k)) pow 2`,
1344 REPEAT STRIP_TAC THEN
1345 MP_TAC(ISPECL [`n + 1`; `\k. (t:real) pow (k - 1)`] AGM) THEN
1346 ASM_SIMP_TAC[REAL_POW_LE; ARITH_RULE `1 <= n + 1`] THEN
1347 SUBGOAL_THEN `1..n+1 = 0+1..n+1` SUBST1_TAC THENL
1348 [REWRITE_TAC[ADD_CLAUSES]; ALL_TAC] THEN
1349 REWRITE_TAC[SUM_OFFSET; PRODUCT_OFFSET; ADD_SUB] THEN
1350 REWRITE_TAC[PRODUCT_SPECIAL] THEN
1351 DISCH_THEN(MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ_ALT] REAL_POW_LE2)) THEN
1352 DISCH_THEN(MP_TAC o SPEC `2`) THEN
1353 ASM_SIMP_TAC[PRODUCT_POS_LE_NUMSEG; REAL_POW_LE] THEN
1354 REWRITE_TAC[REAL_POW_POW] THEN ONCE_REWRITE_TAC[MULT_SYM] THEN
1355 SUBGOAL_THEN `2 * (n * (n + 1)) DIV 2 = n * (n + 1)` SUBST1_TAC THENL
1356 [SUBGOAL_THEN `EVEN(n * (n + 1))` MP_TAC THENL
1357 [REWRITE_TAC[EVEN_ADD; EVEN_MULT; ARITH_EVEN] THEN CONV_TAC TAUT;
1358 SIMP_TAC[EVEN_EXISTS; LEFT_IMP_EXISTS_THM; DIV_MULT; ARITH]];
1359 REWRITE_TAC[GSYM REAL_POW_POW] THEN DISCH_THEN(MP_TAC o MATCH_MP
1360 (REWRITE_RULE[IMP_CONJ_ALT] REAL_POW_LE2_REV)) THEN
1361 REWRITE_TAC[ADD_EQ_0; ARITH_EQ; REAL_POW_2; REAL_LE_SQUARE] THEN
1362 REWRITE_TAC[GSYM REAL_POW_2; GSYM REAL_OF_NUM_ADD] THEN
1363 ASM_SIMP_TAC[REAL_POW_DIV; REAL_LE_RDIV_EQ; REAL_POW_LT;
1364 REAL_ARITH `&0 < &n + &1`] THEN
1365 REWRITE_TAC[REAL_MUL_AC]]);;
1367 (* ------------------------------------------------------------------------- *)
1368 (* The trickiest part: the nonvanishing of L-series for real character. *)
1369 (* Proof from Monsky's article (AMM 1993, pp. 861-2). *)
1370 (* ------------------------------------------------------------------------- *)
1372 let DIVISORSUM_PRIMEPOW = prove
1374 ==> sum {m | m divides (p EXP k)} c = sum(0..k) (\i. c(p EXP i))`,
1375 REPEAT STRIP_TAC THEN
1376 ASM_SIMP_TAC[DIVIDES_PRIMEPOW; SET_RULE
1377 `{m | ?i. P i /\ m = f i} = IMAGE f {i | P i}`] THEN
1378 GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [GSYM o_DEF] THEN
1379 REWRITE_TAC[GSYM NUMSEG_LE] THEN MATCH_MP_TAC SUM_IMAGE THEN
1380 ASM_SIMP_TAC[IN_ELIM_THM; EQ_EXP; FINITE_NUMSEG_LE] THEN
1381 ASM_MESON_TAC[PRIME_0; PRIME_1]);;
1383 let DIVISORVSUM_PRIMEPOW = prove
1385 ==> vsum {m | m divides (p EXP k)} c = vsum(0..k) (\i. c(p EXP i))`,
1386 REPEAT STRIP_TAC THEN
1387 ASM_SIMP_TAC[DIVIDES_PRIMEPOW; SET_RULE
1388 `{m | ?i. P i /\ m = f i} = IMAGE f {i | P i}`] THEN
1389 GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [GSYM o_DEF] THEN
1390 REWRITE_TAC[GSYM NUMSEG_LE] THEN MATCH_MP_TAC VSUM_IMAGE THEN
1391 ASM_SIMP_TAC[IN_ELIM_THM; EQ_EXP; FINITE_NUMSEG_LE] THEN
1392 ASM_MESON_TAC[PRIME_0; PRIME_1]);;
1394 let DIRICHLET_CHARACTER_DIVISORSUM_EQ_1 = prove
1395 (`!d c p k. dirichlet_character d c /\ prime p /\ p divides d
1396 ==> vsum {m | m divides (p EXP k)} c = Cx(&1)`,
1397 REPEAT STRIP_TAC THEN
1398 MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC `vsum {1} c : complex` THEN
1401 REWRITE_TAC[VSUM_SING] THEN ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_1]] THEN
1402 MATCH_MP_TAC VSUM_SUPERSET THEN
1403 SIMP_TAC[SUBSET; IN_SING; IN_ELIM_THM; DIVIDES_1] THEN
1404 ASM_SIMP_TAC[DIVIDES_PRIMEPOW; LEFT_AND_EXISTS_THM; LEFT_IMP_EXISTS_THM] THEN
1405 MAP_EVERY X_GEN_TAC [`y:num`; `i:num`] THEN
1406 DISCH_THEN(CONJUNCTS_THEN2 STRIP_ASSUME_TAC MP_TAC) THEN
1407 FIRST_X_ASSUM SUBST_ALL_TAC THEN REWRITE_TAC[COMPLEX_VEC_0] THEN
1408 FIRST_ASSUM(fun th -> SIMP_TAC[MATCH_MP DIRICHLET_CHARACTER_EQ_0 th]) THEN
1409 ONCE_REWRITE_TAC[COPRIME_SYM] THEN REWRITE_TAC[COPRIME_REXP] THEN
1410 ASM_CASES_TAC `i = 0` THEN ASM_REWRITE_TAC[EXP] THEN
1411 ASM_MESON_TAC[COPRIME_SYM; PRIME_COPRIME_EQ]);;
1413 let DIRICHLET_CHARACTER_REAL_CASES = prove
1414 (`!d c. dirichlet_character d c /\ (!n. real(c n))
1415 ==> !n. c n = --Cx(&1) \/ c n = Cx(&0) \/ c n = Cx(&1)`,
1416 REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `n:num` THEN
1417 FIRST_ASSUM(MP_TAC o SPEC `n:num` o MATCH_MP DIRICHLET_CHARACTER_NORM) THEN
1418 FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN REWRITE_TAC[REAL_EXISTS] THEN
1419 DISCH_THEN(X_CHOOSE_THEN `t:real` SUBST1_TAC) THEN
1420 REWRITE_TAC[COMPLEX_NORM_CX; GSYM CX_NEG; CX_INJ] THEN REAL_ARITH_TAC);;
1422 let DIRICHLET_CHARACTER_DIVISORSUM_PRIMEPOW_POS = prove
1423 (`!d c p k. dirichlet_character d c /\ (!n. real(c n)) /\ prime p
1424 ==> &0 <= Re(vsum {m | m divides (p EXP k)} c)`,
1425 REPEAT STRIP_TAC THEN
1426 ASM_SIMP_TAC[RE_VSUM; FINITE_DIVISORS; EXP_EQ_0; PRIME_IMP_NZ] THEN
1427 ASM_SIMP_TAC[DIVISORSUM_PRIMEPOW] THEN
1428 FIRST_ASSUM(fun th -> SIMP_TAC[MATCH_MP DIRICHLET_CHARACTER_POW th]) THEN
1429 MP_TAC(SPECL [`d:num`; `c:num->complex`] DIRICHLET_CHARACTER_REAL_CASES) THEN
1430 ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `p:num`) THEN STRIP_TAC THEN
1431 ASM_SIMP_TAC[GSYM CX_POW; RE_CX; SUM_POS_LE_NUMSEG;
1432 REAL_POW_LE; REAL_POS] THEN
1433 MATCH_MP_TAC(REAL_ARITH `(s = if EVEN k then &1 else &0) ==> &0 <= s`) THEN
1434 SPEC_TAC(`k:num`,`r:num`) THEN
1435 INDUCT_TAC THEN REWRITE_TAC[EVEN; SUM_CLAUSES_NUMSEG] THEN
1436 ASM_REWRITE_TAC[complex_pow; RE_CX; LE_0] THEN COND_CASES_TAC THEN
1437 ASM_REWRITE_TAC[COMPLEX_POW_NEG; COMPLEX_POW_ONE; COMPLEX_MUL_LNEG;
1438 COMPLEX_MUL_RNEG; COMPLEX_NEG_NEG; COMPLEX_MUL_LID;
1442 let DIRICHLET_CHARACTER_DIVISORSUM_POS = prove
1443 (`!d c n. dirichlet_character d c /\ (!n. real(c n)) /\ ~(n = 0)
1444 ==> &0 <= Re(vsum {m | m divides n} c)`,
1445 REPEAT STRIP_TAC THEN FIRST_X_ASSUM(DISJ_CASES_TAC o MATCH_MP (ARITH_RULE
1446 `~(n = 0) ==> n = 1 \/ 1 < n`))
1448 [ASM_SIMP_TAC[DIVIDES_ONE; SING_GSPEC; VSUM_SING] THEN
1449 ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_1; RE_CX; REAL_POS];
1451 UNDISCH_TAC `1 < n` THEN SPEC_TAC(`n:num`,`n:num`) THEN
1452 MATCH_MP_TAC INDUCT_COPRIME_STRONG THEN CONJ_TAC THENL
1453 [ALL_TAC; ASM_MESON_TAC[DIRICHLET_CHARACTER_DIVISORSUM_PRIMEPOW_POS]] THEN
1454 MAP_EVERY X_GEN_TAC [`a:num`; `b:num`] THEN STRIP_TAC THEN
1455 MP_TAC(ISPEC `\m:num. Re(c m)` REAL_MULTIPLICATIVE_DIVISORSUM) THEN
1456 REWRITE_TAC[real_multiplicative] THEN ANTS_TAC THENL
1457 [FIRST_ASSUM(fun th -> REWRITE_TAC[MATCH_MP DIRICHLET_CHARACTER_MUL th]) THEN
1458 ASM_MESON_TAC[DIRICHLET_CHARACTER_EQ_1; RE_CX; REAL; CX_MUL];
1459 DISCH_THEN(MP_TAC o SPECL [`a:num`; `b:num`] o CONJUNCT2) THEN
1460 ASM_SIMP_TAC[GSYM RE_VSUM; FINITE_DIVISORS; MULT_EQ_0;
1461 ARITH_RULE `1 < n ==> ~(n = 0)`; REAL_LE_MUL]]);;
1464 (`!x n. &0 <= x /\ x <= &1 ==> &1 - &n * x <= (&1 - x) pow n`,
1465 REWRITE_TAC[RIGHT_FORALL_IMP_THM] THEN GEN_TAC THEN DISCH_TAC THEN
1466 INDUCT_TAC THEN REWRITE_TAC[real_pow] THENL [REAL_ARITH_TAC; ALL_TAC] THEN
1467 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(&1 - x) * (&1 - &n * x)` THEN
1468 ASM_SIMP_TAC[REAL_LE_LMUL; REAL_SUB_LE; GSYM REAL_OF_NUM_SUC] THEN
1469 MATCH_MP_TAC(REAL_ARITH
1470 `&0 <= n * x * x ==> &1 - (n + &1) * x <= (&1 - x) * (&1 - n * x)`) THEN
1471 SIMP_TAC[REAL_LE_MUL; REAL_POS; REAL_LE_SQUARE]);;
1473 let LFUNCTION_NONZERO_REAL = prove
1474 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d) /\ (!n. real(c n))
1475 ==> ~(Lfunction c = Cx(&0))`,
1476 REPEAT STRIP_TAC THEN
1477 MP_TAC(SPECL [`d:num`; `c:num->complex`]
1478 DIRICHLET_CHARACTER_NONPRINCIPAL_NONTRIVIAL) THEN
1479 ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
1482 ==> summable (from 1) (\n. c(n) * z pow n / (Cx(&1) - z pow n))`
1484 [GEN_TAC THEN DISCH_TAC THEN ASM_CASES_TAC `z = Cx(&0)` THENL
1485 [MATCH_MP_TAC SUMMABLE_FROM_ELSEWHERE THEN EXISTS_TAC `2` THEN
1486 MATCH_MP_TAC SUMMABLE_EQ THEN EXISTS_TAC `\n:num. Cx(&0)` THEN
1487 REWRITE_TAC[GSYM COMPLEX_VEC_0; SUMMABLE_0] THEN
1488 ASM_SIMP_TAC[COMPLEX_VEC_0; COMPLEX_POW_ZERO; IN_FROM;
1489 ARITH_RULE `2 <= n ==> ~(n = 0)`] THEN
1490 CONV_TAC COMPLEX_RING;
1492 MATCH_MP_TAC SERIES_COMPARISON_COMPLEX THEN
1493 EXISTS_TAC `\n. Cx(&2 * norm(z:complex) pow n)` THEN
1494 REWRITE_TAC[REAL_CX; RE_CX] THEN
1495 SIMP_TAC[REAL_LE_MUL; REAL_POS; REAL_POW_LE; NORM_POS_LE] THEN
1496 ASM_SIMP_TAC[CX_MUL; CX_POW; SUMMABLE_COMPLEX_LMUL; COMPLEX_NORM_CX;
1497 REAL_ABS_NORM; SUMMABLE_GP] THEN
1498 REWRITE_TAC[COMPLEX_NORM_MUL] THEN
1499 FIRST_ASSUM(fun th -> SIMP_TAC[MATCH_MP DIRICHLET_CHARACTER_NORM th]) THEN
1500 ONCE_REWRITE_TAC[COND_RAND] THEN ONCE_REWRITE_TAC[COND_RATOR] THEN
1501 ONCE_REWRITE_TAC[COND_RAND] THEN ONCE_REWRITE_TAC[COND_RATOR] THEN
1502 SIMP_TAC[REAL_MUL_LZERO; REAL_MUL_LID; REAL_ABS_POS; REAL_LE_MUL] THEN
1503 REWRITE_TAC[TAUT `(p ==> (if q then x else T)) <=> p /\ q ==> x`] THEN
1504 MP_TAC(SPECL [`norm(z:complex)`; `&1 / &2`] REAL_ARCH_POW_INV) THEN
1505 CONV_TAC REAL_RAT_REDUCE_CONV THEN ASM_REWRITE_TAC[] THEN
1506 MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN DISCH_TAC THEN
1507 X_GEN_TAC `n:num` THEN REWRITE_TAC[GE] THEN STRIP_TAC THEN
1508 REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NORM; REAL_ABS_NUM; REAL_ABS_POW] THEN
1509 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
1510 REWRITE_TAC[complex_div; COMPLEX_NORM_MUL; COMPLEX_NORM_POW] THEN
1511 MATCH_MP_TAC REAL_LE_LMUL THEN SIMP_TAC[REAL_POW_LE; NORM_POS_LE] THEN
1512 REWRITE_TAC[COMPLEX_NORM_INV] THEN
1513 SUBST1_TAC(REAL_ARITH `&2 = inv(&1 / &2)`) THEN
1514 MATCH_MP_TAC REAL_LE_INV2 THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
1515 MATCH_MP_TAC(NORM_ARITH
1516 `norm(z) <= norm(w) - h ==> h <= norm(w - z)`) THEN
1517 REWRITE_TAC[COMPLEX_NORM_CX] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
1518 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `norm(z:complex) pow N` THEN
1519 ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN REWRITE_TAC[COMPLEX_NORM_POW] THEN
1520 MATCH_MP_TAC REAL_POW_MONO_INV THEN
1521 ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE];
1523 REWRITE_TAC[summable; RIGHT_IMP_EXISTS_THM; SKOLEM_THM] THEN
1524 DISCH_THEN(X_CHOOSE_THEN `f:complex->complex` (LABEL_TAC "+")) THEN
1525 ABBREV_TAC `b = \z n. inv(Cx(&n) * (Cx(&1) - z)) -
1526 z pow n / (Cx(&1) - z pow n)` THEN
1528 `!z:complex. norm(z) < &1 ==> ((\n. c(n) * b z n) sums --(f z)) (from 1)`
1531 [REPEAT STRIP_TAC THEN EXPAND_TAC "b" THEN
1532 REWRITE_TAC[COMPLEX_SUB_LDISTRIB; GSYM COMPLEX_SUB_LZERO] THEN
1533 MATCH_MP_TAC SERIES_SUB THEN ASM_SIMP_TAC[GSYM COMPLEX_SUB_LDISTRIB] THEN
1534 REWRITE_TAC[COMPLEX_INV_MUL; COMPLEX_MUL_ASSOC] THEN
1535 SUBST1_TAC(COMPLEX_RING `Cx(&0) = Cx(&0) * inv(Cx(&1) - z)`) THEN
1536 MATCH_MP_TAC SERIES_COMPLEX_RMUL THEN
1537 MP_TAC(SPECL [`d:num`; `c:num->complex`] LFUNCTION) THEN
1538 ASM_REWRITE_TAC[complex_div];
1540 SUBGOAL_THEN `!z. norm(z) < &1
1541 ==> ((\n. vsum {d | d divides n} (\d. c d) * z pow n) sums
1543 (LABEL_TAC "+") THENL
1544 [REPEAT STRIP_TAC THEN REWRITE_TAC[sums; FROM_INTER_NUMSEG] THEN
1545 SIMP_TAC[GSYM VSUM_COMPLEX_RMUL; FINITE_DIVISORS; LE_1] THEN
1546 REWRITE_TAC[VSUM_VSUM_DIVISORS] THEN
1547 REMOVE_THEN "+" (MP_TAC o SPEC `z:complex`) THEN
1548 ASM_REWRITE_TAC[] THEN
1549 SIMP_TAC[VSUM_COMPLEX_LMUL; FINITE_NUMSEG; sums; FROM_INTER_NUMSEG] THEN
1550 MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] LIM_TRANSFORM) THEN
1551 SIMP_TAC[GSYM VSUM_SUB; FINITE_NUMSEG] THEN
1552 REWRITE_TAC[GSYM COMPLEX_SUB_LDISTRIB] THEN
1553 ONCE_REWRITE_TAC[MULT_SYM] THEN REWRITE_TAC[GSYM COMPLEX_POW_POW] THEN
1554 REWRITE_TAC[VSUM_GP; ARITH_RULE `n < 1 <=> n = 0`] THEN
1555 SIMP_TAC[DIV_EQ_0; LE_1] THEN SIMP_TAC[GSYM NOT_LE] THEN
1556 SUBGOAL_THEN `!k. 1 <= k ==> ~(z pow k = Cx(&1))` (fun th -> SIMP_TAC[th])
1557 THENL [ASM_MESON_TAC[COMPLEX_POW_EQ_1; LE_1; REAL_LT_REFL]; ALL_TAC] THEN
1558 REWRITE_TAC[COMPLEX_POW_1; complex_div] THEN
1559 REWRITE_TAC[COMPLEX_RING `(zx * i - (zx - w) * i) = w * i`] THEN
1560 SIMP_TAC[COMPLEX_POW_POW] THEN MATCH_MP_TAC LIM_TRANSFORM_EVENTUALLY THEN
1561 EXISTS_TAC `\x. vsum (1..x)
1562 (\n. z pow x * c n *
1563 z pow (n - x MOD n) / (Cx(&1) - z pow n))` THEN
1565 [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `x:num` THEN
1566 REWRITE_TAC[] THEN MATCH_MP_TAC VSUM_EQ_NUMSEG THEN
1567 X_GEN_TAC `n:num` THEN STRIP_TAC THEN REWRITE_TAC[] THEN
1568 REWRITE_TAC[complex_div; COMPLEX_INV_MUL; COMPLEX_MUL_ASSOC] THEN
1569 AP_THM_TAC THEN AP_TERM_TAC THEN
1570 ONCE_REWRITE_TAC[COMPLEX_RING `(zx * cn) * zn = cn * zx * zn`] THEN
1571 AP_TERM_TAC THEN REWRITE_TAC[GSYM COMPLEX_POW_ADD] THEN
1572 AP_TERM_TAC THEN REWRITE_TAC[MULT_CLAUSES] THEN
1573 MP_TAC(SPECL [`x:num`; `n:num`] DIVISION) THEN ASM_SIMP_TAC[LE_1] THEN
1576 REWRITE_TAC[COMPLEX_VEC_0] THEN
1577 MATCH_MP_TAC LIM_NULL_COMPARISON_COMPLEX THEN
1578 EXISTS_TAC `\x. Cx(norm(z) / (&1 - norm z)) * Cx(&x) * z pow x` THEN
1580 [MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `x:num` THEN
1581 REWRITE_TAC[] THEN MATCH_MP_TAC VSUM_NORM_TRIANGLE THEN
1582 REWRITE_TAC[FINITE_NUMSEG; COMPLEX_NORM_MUL; COMPLEX_NORM_CX;
1583 REAL_ABS_DIV; REAL_ABS_NUM] THEN
1584 GEN_REWRITE_TAC RAND_CONV [REAL_ARITH `a * &x * b = &x * a * b`] THEN
1585 GEN_REWRITE_TAC (RAND_CONV o LAND_CONV o RAND_CONV)
1586 [GSYM CARD_NUMSEG_1] THEN
1587 MATCH_MP_TAC SUM_BOUND THEN REWRITE_TAC[FINITE_NUMSEG] THEN
1588 X_GEN_TAC `n:num` THEN REWRITE_TAC[IN_NUMSEG] THEN STRIP_TAC THEN
1589 FIRST_ASSUM(fun t -> SIMP_TAC[MATCH_MP DIRICHLET_CHARACTER_NORM t]) THEN
1591 ASM_SIMP_TAC[REAL_MUL_LZERO; REAL_MUL_RZERO; REAL_LE_DIV; REAL_ABS_POS;
1592 NORM_POS_LE; REAL_LE_MUL; REAL_MUL_LID; REAL_ABS_NORM] THEN
1593 GEN_REWRITE_TAC RAND_CONV [REAL_MUL_SYM] THEN
1594 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[NORM_POS_LE] THEN
1595 SIMP_TAC[complex_div; real_div; COMPLEX_NORM_MUL; COMPLEX_NORM_INV] THEN
1596 MATCH_MP_TAC REAL_LE_MUL2 THEN SIMP_TAC[NORM_POS_LE; REAL_LE_INV_EQ] THEN
1598 [REWRITE_TAC[COMPLEX_NORM_POW] THEN
1599 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_POW_1] THEN
1600 MATCH_MP_TAC REAL_POW_MONO_INV THEN
1601 ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE] THEN
1602 MATCH_MP_TAC(ARITH_RULE `m < r ==> 1 <= r - m`) THEN
1603 ASM_SIMP_TAC[DIVISION; LE_1];
1605 MATCH_MP_TAC REAL_LE_INV2 THEN
1606 REWRITE_TAC[REAL_ARITH `&0 < abs(x - a) <=> ~(a = x)`] THEN
1607 CONJ_TAC THENL [ASM_MESON_TAC[REAL_LT_REFL]; ALL_TAC] THEN
1608 MATCH_MP_TAC(NORM_ARITH
1609 `norm(w) = &1 /\ norm(z) < &1 /\ norm(zn) <= norm(z)
1610 ==> abs(&1 - norm(z)) <= norm(w - zn)`) THEN
1611 ASM_REWRITE_TAC[COMPLEX_NORM_NUM; COMPLEX_NORM_POW] THEN
1612 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_POW_1] THEN
1613 MATCH_MP_TAC REAL_POW_MONO_INV THEN
1614 ASM_SIMP_TAC[REAL_LT_IMP_LE; NORM_POS_LE];
1616 MATCH_MP_TAC LIM_NULL_COMPLEX_LMUL THEN ASM_SIMP_TAC[LIM_N_TIMES_POWN];
1620 { (f:complex->complex)(t) | real t /\ &0 <= Re t /\ norm(t) < &1 })`
1622 [REWRITE_TAC[BOUNDED_POS] THEN ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
1623 REWRITE_TAC[FORALL_IN_IMAGE; IN_ELIM_THM] THEN
1624 REWRITE_TAC[IMP_CONJ; FORALL_REAL] THEN
1625 REWRITE_TAC[COMPLEX_NORM_CX; RE_CX; IMP_IMP] THEN
1626 REWRITE_TAC[REAL_ARITH `&0 <= x /\ abs x < &1 <=> &0 <= x /\ x < &1`] THEN
1627 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
1628 FIRST_ASSUM(X_CHOOSE_THEN `p:num` STRIP_ASSUME_TAC o
1629 MATCH_MP PRIME_FACTOR) THEN
1630 X_CHOOSE_TAC `N:num` (SPEC `&2 * (B + &1)` REAL_ARCH_SIMPLE) THEN
1631 SUBGOAL_THEN `0 < N` ASSUME_TAC THENL
1632 [REWRITE_TAC[GSYM REAL_OF_NUM_LT] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN
1633 ABBREV_TAC `t = &1 - inv(&(p EXP N)) / &2` THEN
1634 SUBGOAL_THEN `&0 <= t /\ t < &1` STRIP_ASSUME_TAC THENL
1635 [EXPAND_TAC "t" THEN
1636 MATCH_MP_TAC(REAL_ARITH
1637 `&0 < y /\ y <= &1 ==> &0 <= &1 - y / &2 /\ &1 - y / &2 < &1`) THEN
1638 ASM_SIMP_TAC[REAL_INV_LE_1; REAL_LT_INV_EQ; REAL_OF_NUM_LE;
1639 REAL_OF_NUM_LT; LE_1; EXP_EQ_0; PRIME_IMP_NZ];
1641 REMOVE_THEN "+" (MP_TAC o SPEC `Cx t`) THEN
1642 REWRITE_TAC[COMPLEX_NORM_CX; NOT_IMP] THEN
1643 CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
1644 FIRST_X_ASSUM(MP_TAC o SPEC `t:real`) THEN ASM_REWRITE_TAC[] THEN
1645 DISCH_TAC THEN REWRITE_TAC[SERIES_FROM; LIM_SEQUENTIALLY] THEN
1646 DISCH_THEN(MP_TAC o SPEC `&1`) THEN REWRITE_TAC[REAL_LT_01] THEN
1647 DISCH_THEN(X_CHOOSE_THEN `M:num` MP_TAC) THEN
1648 SUBGOAL_THEN `?n. M <= n /\ 1 <= n /\ p EXP N <= n` STRIP_ASSUME_TAC THENL
1649 [EXISTS_TAC `p EXP N + M + 1` THEN ARITH_TAC; ALL_TAC] THEN
1650 DISCH_THEN(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[] THEN
1651 UNDISCH_TAC `norm (f (Cx t):complex) <= B` THEN
1652 MATCH_MP_TAC(NORM_ARITH
1653 `B + &1 <= norm(x) ==> norm(y) <= B ==> ~(dist(x,y) < &1)`) THEN
1654 MATCH_MP_TAC(REAL_ARITH
1655 `a <= Re z /\ abs(Re z) <= norm z ==> a <= norm z`) THEN
1656 REWRITE_TAC[COMPLEX_NORM_GE_RE_IM] THEN
1657 SIMP_TAC[RE_VSUM; FINITE_NUMSEG; RE_MUL_CX; GSYM CX_POW] THEN
1658 MATCH_MP_TAC REAL_LE_TRANS THEN
1659 EXISTS_TAC `sum (IMAGE (\k. p EXP k) (0..N))
1660 (\x. Re (vsum {d | d divides x} (\d. c d)) * t pow x)` THEN
1663 MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN
1664 REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG; IN_DIFF; SUBSET; IN_ELIM_THM;
1665 FORALL_IN_IMAGE] THEN
1666 MP_TAC(SPECL [`d:num`; `c:num->complex`]
1667 DIRICHLET_CHARACTER_DIVISORSUM_POS) THEN
1668 ASM_SIMP_TAC[REAL_POW_LE; REAL_LE_MUL; LE_1; ETA_AX] THEN
1669 DISCH_THEN(K ALL_TAC) THEN
1670 REWRITE_TAC[ARITH_RULE `1 <= n <=> ~(n = 0)`] THEN
1671 ASM_SIMP_TAC[EXP_EQ_0; PRIME_IMP_NZ] THEN
1672 X_GEN_TAC `k:num` THEN STRIP_TAC THEN
1673 MATCH_MP_TAC LE_TRANS THEN EXISTS_TAC `p EXP N` THEN
1674 ASM_SIMP_TAC[LE_EXP; PRIME_IMP_NZ]] THEN
1675 W(MP_TAC o PART_MATCH (lhs o rand) SUM_IMAGE o rand o snd) THEN
1677 [REWRITE_TAC[EQ_EXP] THEN ASM_MESON_TAC[PRIME_0; PRIME_1]; ALL_TAC] THEN
1678 DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[o_DEF] THEN
1679 MATCH_MP_TAC REAL_LE_TRANS THEN
1680 EXISTS_TAC `sum (0..N) (\k. &1 * &1 / &2)` THEN CONJ_TAC THENL
1681 [REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; GSYM REAL_OF_NUM_ADD] THEN
1684 MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN
1685 REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
1686 CONV_TAC REAL_RAT_REDUCE_CONV THEN CONJ_TAC THENL
1687 [MP_TAC(SPECL [`d:num`; `c:num->complex`; `p:num`; `k:num`]
1688 DIRICHLET_CHARACTER_DIVISORSUM_EQ_1) THEN
1689 ASM_SIMP_TAC[ETA_AX; RE_CX; REAL_LE_REFL];
1691 MP_TAC(ISPECL [`inv(&(p EXP N)) / &2`; `p EXP k`] lemma) THEN
1692 ASM_REWRITE_TAC[] THEN ANTS_TAC THENL
1693 [REWRITE_TAC[real_div; GSYM REAL_INV_MUL; REAL_OF_NUM_MUL] THEN
1694 REWRITE_TAC[REAL_LE_INV_EQ; REAL_POS] THEN
1695 MATCH_MP_TAC REAL_INV_LE_1 THEN
1696 REWRITE_TAC[REAL_OF_NUM_LE; ARITH_RULE `1 <= n <=> ~(n = 0)`] THEN
1697 ASM_SIMP_TAC[EXP_EQ_0; MULT_EQ_0; ARITH; PRIME_IMP_NZ];
1699 MATCH_MP_TAC(REAL_ARITH `b <= a ==> a <= x ==> b <= x`) THEN
1700 MATCH_MP_TAC(REAL_ARITH `x * y <= &1 ==> &1 / &2 <= &1 - x * y / &2`) THEN
1701 ASM_SIMP_TAC[GSYM real_div; REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LE_1;
1702 EXP_EQ_0; PRIME_IMP_NZ] THEN
1703 ASM_REWRITE_TAC[REAL_MUL_LID; REAL_OF_NUM_LE; LE_EXP] THEN
1704 ASM_MESON_TAC[PRIME_0];
1706 MP_TAC(SPECL [`d:num`; `c:num->complex`]
1707 BOUNDED_LFUNCTION_PARTIAL_SUMS) THEN
1708 ASM_REWRITE_TAC[] THEN
1709 DISCH_THEN(MP_TAC o MATCH_MP BOUNDED_PARTIAL_SUMS) THEN
1710 REWRITE_TAC[BOUNDED_POS] THEN ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
1711 REWRITE_TAC[FORALL_IN_IMAGE] THEN
1712 SIMP_TAC[IN_ELIM_THM; IN_UNIV; LEFT_IMP_EXISTS_THM] THEN
1713 REWRITE_TAC[MESON[] `(!x a b. x = f a b ==> p a b) <=> (!a b. p a b)`] THEN
1714 X_GEN_TAC `B:real` THEN STRIP_TAC THEN EXISTS_TAC `&2 * B` THEN
1715 ASM_SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT; ARITH] THEN
1716 X_GEN_TAC `z:complex` THEN STRIP_TAC THEN
1717 ONCE_REWRITE_TAC[GSYM NORM_NEG] THEN
1718 MATCH_MP_TAC(ISPEC `sequentially` LIM_NORM_UBOUND) THEN
1720 `\n. vsum(from 1 INTER (0..n)) (\k. c k * b (z:complex) k :complex)` THEN
1721 ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; GSYM sums] THEN
1722 REWRITE_TAC[FROM_INTER_NUMSEG] THEN
1723 MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `n:num` THEN
1724 MP_TAC(ISPECL [`c:num->complex`; `(b:complex->num->complex) z`;
1725 `B:real`; `1`] SERIES_DIRICHLET_COMPLEX_VERY_EXPLICIT) THEN
1726 ASM_REWRITE_TAC[LE_REFL] THEN ANTS_TAC THENL
1728 DISCH_THEN(MP_TAC o SPEC `1`) THEN
1729 SUBGOAL_THEN `(b:complex->num->complex) z 1 = Cx(&1)` SUBST1_TAC THENL
1730 [EXPAND_TAC "b" THEN
1731 REWRITE_TAC[COMPLEX_POW_1; COMPLEX_INV_MUL; complex_div] THEN
1732 REWRITE_TAC[GSYM COMPLEX_SUB_RDISTRIB; COMPLEX_INV_1] THEN
1733 MATCH_MP_TAC COMPLEX_MUL_RINV THEN REWRITE_TAC[COMPLEX_SUB_0] THEN
1734 DISCH_THEN(SUBST_ALL_TAC o SYM) THEN
1735 UNDISCH_TAC `norm(Cx(&1)) < &1` THEN
1736 REWRITE_TAC[COMPLEX_NORM_CX; REAL_LT_REFL; REAL_ABS_NUM];
1738 REWRITE_TAC[COMPLEX_NORM_NUM; REAL_MUL_RID] THEN
1739 DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[LE_REFL]] THEN
1740 FIRST_X_ASSUM(X_CHOOSE_THEN `t:real` SUBST_ALL_TAC o
1741 GEN_REWRITE_RULE I [REAL_EXISTS]) THEN
1742 RULE_ASSUM_TAC(REWRITE_RULE[RE_CX; COMPLEX_NORM_CX]) THEN
1743 SUBGOAL_THEN `!n. &0 < sum(0..n) (\m. t pow m)` ASSUME_TAC THENL
1744 [GEN_TAC THEN SIMP_TAC[LE_0; SUM_CLAUSES_LEFT; real_pow] THEN
1745 MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < &1 + x`) THEN
1746 ASM_SIMP_TAC[SUM_POS_LE_NUMSEG; REAL_POW_LE];
1748 CONJ_TAC THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN EXPAND_TAC "b" THEN
1749 REWRITE_TAC[GSYM CX_SUB; GSYM CX_POW; GSYM CX_DIV; GSYM CX_MUL;
1750 GSYM CX_INV; REAL_CX; RE_CX]
1752 [ASM_SIMP_TAC[REAL_SUB_POW_L1; REAL_SUB_LE] THEN
1753 ASM_REWRITE_TAC[real_div; REAL_INV_MUL] THEN
1754 ASM_SIMP_TAC[GSYM real_div; REAL_LE_RDIV_EQ; REAL_LT_MUL; REAL_OF_NUM_LT;
1755 LE_1; REAL_ARITH `abs t < &1 ==> &0 < &1 - t`] THEN
1756 ASM_SIMP_TAC[real_div; REAL_FIELD
1757 `abs(t) < &1 ==> (x * inv(&1 - t) * y) * (&1 - t) = x * y`] THEN
1758 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
1759 ASM_SIMP_TAC[GSYM real_div; REAL_LE_RDIV_EQ; REAL_OF_NUM_LT; LE_1] THEN
1760 ONCE_REWRITE_TAC[REAL_ARITH `x / y * &n = (&n * x) / y`] THEN
1761 ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN
1762 MATCH_MP_TAC REAL_LE_TRANS THEN
1763 EXISTS_TAC `sum(0..n-1) (\m. t pow n)` THEN CONJ_TAC THENL
1764 [ASM_SIMP_TAC[SUM_CONST_NUMSEG; ARITH_RULE `1 <= n ==> n - 1 + 1 = n`;
1765 SUB_0; REAL_LE_REFL];
1766 REWRITE_TAC[REAL_MUL_LID] THEN MATCH_MP_TAC SUM_LE_NUMSEG THEN
1767 GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC[] THEN
1768 MATCH_MP_TAC REAL_POW_MONO_INV THEN REPEAT CONJ_TAC THEN
1769 TRY ASM_REAL_ARITH_TAC THEN ASM_ARITH_TAC];
1771 ASM_SIMP_TAC[REAL_SUB_POW_L1; ARITH_RULE `1 <= n + 1`] THEN
1772 REWRITE_TAC[ADD_SUB; REAL_INV_MUL; real_div] THEN
1773 REWRITE_TAC[REAL_ARITH `x * t - y * t * z <= u * t - v * t * w <=>
1774 t * (v * w - y * z) <= t * (u - x)`] THEN
1775 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_LE_INV_EQ] THEN
1776 CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
1777 ASM_SIMP_TAC[GSYM real_div; REAL_FIELD
1778 `&0 < y /\ &0 < z ==> x / y - w / z = (x * z - w * y) / (y * z)`] THEN
1779 SUBGOAL_THEN `t pow n * sum (0..n) (\m. t pow m) -
1780 t pow (n + 1) * sum (0..n - 1) (\m. t pow m) = t pow n`
1782 [REWRITE_TAC[GSYM SUM_LMUL; GSYM REAL_POW_ADD] THEN
1783 ONCE_REWRITE_TAC[ARITH_RULE `(n + 1) + x = n + x + 1`] THEN
1784 REWRITE_TAC[GSYM(SPEC `1` SUM_OFFSET); SUB_ADD; ADD_CLAUSES] THEN
1785 SIMP_TAC[SUM_CLAUSES_LEFT; LE_0; GSYM SUM_LMUL; ADD_CLAUSES] THEN
1786 ASM_SIMP_TAC[SUB_ADD; REAL_POW_ADD] THEN
1787 REWRITE_TAC[REAL_ARITH `(x + y) - y:real = x`];
1789 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LT_MUL; GSYM REAL_OF_NUM_ADD;
1791 REAL_FIELD `&1 <= n ==> inv(n) - inv(n + &1) = inv(n * (n + &1))`] THEN
1792 MATCH_MP_TAC REAL_POW_LE2_REV THEN EXISTS_TAC `2` THEN
1793 REWRITE_TAC[ARITH] THEN CONJ_TAC THENL
1794 [REPEAT(MATCH_MP_TAC REAL_LE_MUL THEN
1795 CONJ_TAC THEN REWRITE_TAC[REAL_LE_INV_EQ]) THEN
1796 ASM_SIMP_TAC[REAL_POW_LE; SUM_POS_LE_NUMSEG] THEN REAL_ARITH_TAC;
1798 MP_TAC(SPECL [`n:num`; `t:real`] AGM_SPECIAL) THEN
1799 MP_TAC(SPECL [`n - 1`; `t:real`] AGM_SPECIAL) THEN
1800 ASM_SIMP_TAC[GSYM REAL_OF_NUM_SUB; REAL_SUB_ADD] THEN
1801 REWRITE_TAC[IMP_IMP] THEN
1802 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [REAL_MUL_SYM] THEN
1803 ASM_SIMP_TAC[GSYM REAL_LE_RDIV_EQ; REAL_POW_LT; REAL_OF_NUM_LT;
1804 LE_1; REAL_ARITH `&0 < &n + &1`] THEN
1805 DISCH_THEN(MP_TAC o MATCH_MP (REWRITE_RULE
1806 [TAUT `a /\ b /\ c /\ d ==> e <=> b /\ d ==> a /\ c ==> e`]
1808 ASM_SIMP_TAC[REAL_POW_LE; REAL_LE_MUL; REAL_ARITH `&0 <= &n + &1`] THEN
1809 MATCH_MP_TAC(REAL_ARITH `x = y /\ a <= b ==> b <= x ==> a <= y`) THEN
1811 [REWRITE_TAC[REAL_POW_2; real_div; REAL_INV_MUL; REAL_POW_MUL] THEN
1812 REWRITE_TAC[REAL_MUL_AC];
1813 REWRITE_TAC[GSYM REAL_POW_ADD; REAL_POW_POW] THEN
1814 MATCH_MP_TAC REAL_POW_MONO_INV THEN ASM_REWRITE_TAC[] THEN
1815 CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ARITH_TAC]]);;
1817 (* ------------------------------------------------------------------------- *)
1818 (* Deduce nonvanishing of all the nonprincipal characters. *)
1819 (* ------------------------------------------------------------------------- *)
1821 let BOUNDED_DIFF_LOGMUL = prove
1822 (`!f a. bounded {f x - Cx(log(&x)) * a | x IN (:num)}
1823 ==> (!x. &0 <= Re(f x)) ==> &0 <= Re a`,
1825 REWRITE_TAC[BOUNDED_POS; SIMPLE_IMAGE; FORALL_IN_IMAGE; IN_UNIV] THEN
1826 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN DISCH_TAC THEN
1827 ONCE_REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN
1828 MP_TAC(ISPEC `exp((B + &1) / --(Re a))` REAL_ARCH_SIMPLE) THEN
1829 DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN
1830 SUBGOAL_THEN `abs(Re(f n - Cx(log(&n)) * a)) <= B` MP_TAC THENL
1831 [ASM_MESON_TAC[COMPLEX_NORM_GE_RE_IM; REAL_LE_TRANS]; ALL_TAC] THEN
1832 REWRITE_TAC[RE_SUB; RE_MUL_CX; REAL_NOT_LE] THEN
1833 MATCH_MP_TAC(REAL_ARITH
1834 `B < l * --a /\ &0 <= f ==> B < abs(f - l * a)`) THEN
1835 ASM_SIMP_TAC[GSYM REAL_LT_LDIV_EQ; REAL_NEG_GT0] THEN
1836 MATCH_MP_TAC REAL_LTE_TRANS THEN
1837 EXISTS_TAC `log(exp((B + &1) / --Re a))` THEN CONJ_TAC THENL
1838 [ASM_SIMP_TAC[LOG_EXP; REAL_NEG_GT0; REAL_LT_DIV2_EQ] THEN REAL_ARITH_TAC;
1839 MATCH_MP_TAC LOG_MONO_LE_IMP THEN ASM_REWRITE_TAC[REAL_EXP_POS_LT]]);;
1841 let LFUNCTION_NONZERO_NONPRINCIPAL = prove
1842 (`!d c. dirichlet_character d c /\ ~(c = chi_0 d)
1843 ==> ~(Lfunction c = Cx(&0))`,
1847 ==> !f. sum s f = sum (s DIFF {a,b,c}) f + sum {a,b,c} f`,
1848 REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN
1849 MATCH_MP_TAC SUM_UNION_EQ THEN ASM_REWRITE_TAC[] THEN ASM SET_TAC[]) in
1850 GEN_TAC THEN ASM_CASES_TAC `d = 0` THENL
1851 [ASM_MESON_TAC[DIRICHLET_CHARACTER_0]; ALL_TAC] THEN
1853 [`\x c. vsum(1..x) (\n. c n * Cx(mangoldt n / &n)) -
1855 (if c = chi_0 d then Cx(&1)
1856 else if Lfunction c = Cx(&0) then --Cx(&1)
1859 `{c | dirichlet_character d c}`]
1860 BOUNDED_SUMS_IMAGES) THEN
1862 [REWRITE_TAC[FINITE_DIRICHLET_CHARACTERS; IN_ELIM_THM] THEN
1863 X_GEN_TAC `c:num->complex` THEN
1864 ASM_CASES_TAC `c = chi_0 d` THEN
1865 ASM_SIMP_TAC[COMPLEX_MUL_RID; BOUNDED_DIRICHLET_MANGOLDT_PRINCIPAL;
1867 ASM_CASES_TAC `Lfunction c = Cx(&0)` THEN
1868 ASM_REWRITE_TAC[COMPLEX_SUB_RZERO; COMPLEX_MUL_RNEG; COMPLEX_MUL_RZERO;
1869 COMPLEX_MUL_RID; COMPLEX_SUB_RNEG] THEN
1870 ASM_MESON_TAC[BOUNDED_DIRICHLET_MANGOLDT_ZERO;
1871 BOUNDED_DIRICHLET_MANGOLDT_NONZERO; LE_1];
1873 SIMP_TAC[VSUM_SUB; FINITE_DIRICHLET_CHARACTERS; VSUM_COMPLEX_LMUL] THEN
1874 DISCH_THEN(MP_TAC o MATCH_MP BOUNDED_DIFF_LOGMUL) THEN
1875 REWRITE_TAC[IN_UNIV] THEN ANTS_TAC THENL
1876 [X_GEN_TAC `x:num` THEN
1877 W(MP_TAC o PART_MATCH (lhs o rand) VSUM_SWAP o funpow 2 rand o snd) THEN
1878 REWRITE_TAC[FINITE_DIRICHLET_CHARACTERS; FINITE_NUMSEG] THEN
1879 DISCH_THEN SUBST1_TAC THEN
1880 SIMP_TAC[VSUM_COMPLEX_RMUL; FINITE_DIRICHLET_CHARACTERS] THEN
1881 SIMP_TAC[RE_VSUM; FINITE_NUMSEG; RE_MUL_CX] THEN
1882 MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN
1883 X_GEN_TAC `n:num` THEN STRIP_TAC THEN REWRITE_TAC[] THEN
1884 MATCH_MP_TAC REAL_LE_MUL THEN
1885 SIMP_TAC[DIRICHLET_CHARACTER_SUM_OVER_CHARACTERS_POS;
1886 REAL_LE_DIV; REAL_POS; MANGOLDT_POS_LE];
1888 SIMP_TAC[RE_VSUM; FINITE_DIRICHLET_CHARACTERS] THEN
1889 REPLICATE_TAC 2 (ONCE_REWRITE_TAC[COND_RAND]) THEN
1890 REWRITE_TAC[RE_NEG; RE_CX] THEN DISCH_TAC THEN
1891 X_GEN_TAC `c:num->complex` THEN STRIP_TAC THEN STRIP_TAC THEN
1892 FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM REAL_NOT_LT]) THEN
1895 `{chi_0 d,c,(\n. cnj(c n))} SUBSET {c | dirichlet_character d c}`
1897 [REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY] THEN
1898 REPEAT STRIP_TAC THEN
1899 ASM_SIMP_TAC[DIRICHLET_CHARACTER_CHI_0; DIRICHLET_CHARACTER_CNJ];
1901 DISCH_THEN(MP_TAC o MATCH_MP lemma) THEN
1902 REWRITE_TAC[FINITE_DIRICHLET_CHARACTERS] THEN
1903 DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN
1904 MATCH_MP_TAC(REAL_ARITH `s <= &0 /\ t < &0 ==> s + t < &0`) THEN
1906 [MATCH_MP_TAC(REAL_ARITH `&0 <= --x ==> x <= &0`) THEN
1907 REWRITE_TAC[GSYM SUM_NEG] THEN MATCH_MP_TAC SUM_POS_LE THEN
1908 SIMP_TAC[FINITE_DIRICHLET_CHARACTERS; FINITE_DIFF] THEN
1909 SIMP_TAC[IN_DIFF; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM] THEN
1912 ASM_SIMP_TAC[SUM_CLAUSES; FINITE_INSERT; IN_INSERT; NOT_IN_EMPTY;
1914 SUBGOAL_THEN `~(chi_0 d = (\n. cnj (c n)))` ASSUME_TAC THENL
1915 [DISCH_THEN(MP_TAC o AP_TERM `(\c n:num. cnj(c n))`) THEN
1916 REWRITE_TAC[CNJ_CNJ; FUN_EQ_THM; CNJ_CHI_0] THEN
1917 ASM_REWRITE_TAC[GSYM FUN_EQ_THM; ETA_AX];
1919 SUBGOAL_THEN `~(c = \n:num. cnj(c n))` ASSUME_TAC THENL
1920 [ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN
1921 REWRITE_TAC[GSYM REAL_CNJ; FUN_EQ_THM] THEN
1922 ASM_MESON_TAC[LFUNCTION_NONZERO_REAL];
1924 MP_TAC(SPECL [`d:num`; `c:num->complex`] LFUNCTION_CNJ) THEN
1925 ASM_SIMP_TAC[CNJ_EQ_CX] THEN REAL_ARITH_TAC);;
1927 (* ------------------------------------------------------------------------- *)
1928 (* Hence derive our boundedness result for all nonprincipal characters. *)
1929 (* ------------------------------------------------------------------------- *)
1931 let BOUNDED_DIRICHLET_MANGOLDT_NONPRINCIPAL = prove
1933 dirichlet_character d c /\ ~(c = chi_0 d)
1934 ==> bounded { vsum(1..x) (\n. c n * Cx(mangoldt n / &n)) | x IN (:num)}`,
1935 REPEAT STRIP_TAC THEN MATCH_MP_TAC BOUNDED_DIRICHLET_MANGOLDT_NONZERO THEN
1936 EXISTS_TAC `d:num` THEN
1937 ASM_MESON_TAC[LFUNCTION_NONZERO_NONPRINCIPAL]);;
1939 (* ------------------------------------------------------------------------- *)
1940 (* Hence the main sum result. *)
1941 (* ------------------------------------------------------------------------- *)
1943 let BOUNDED_SUM_OVER_DIRICHLET_CHARACTERS = prove
1944 (`!d l. 1 <= d /\ coprime(l,d)
1945 ==> bounded { vsum {c | dirichlet_character d c}
1947 vsum(1..x) (\n. c n * Cx (mangoldt n / &n))) -
1948 Cx(log(&x)) | x IN (:num)}`,
1949 REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN
1950 SUBGOAL_THEN `!x. Cx(log(&x)) =
1951 vsum {c | dirichlet_character d c}
1952 (\c. if c = chi_0 d then Cx(log(&x)) else Cx(&0))`
1953 (fun th -> ONCE_REWRITE_TAC[th])
1955 [SIMP_TAC[VSUM_DELTA; GSYM COMPLEX_VEC_0] THEN
1956 REWRITE_TAC[IN_ELIM_THM; DIRICHLET_CHARACTER_CHI_0];
1958 SIMP_TAC[GSYM VSUM_SUB; FINITE_DIRICHLET_CHARACTERS] THEN
1959 MATCH_MP_TAC BOUNDED_SUMS_IMAGES THEN
1960 REWRITE_TAC[FINITE_DIRICHLET_CHARACTERS; IN_ELIM_THM] THEN
1961 X_GEN_TAC `c:num->complex` THEN DISCH_TAC THEN
1962 ASM_CASES_TAC `c = chi_0 d` THEN ASM_REWRITE_TAC[] THENL
1963 [FIRST_ASSUM(MP_TAC o MATCH_MP BOUNDED_DIRICHLET_MANGOLDT_PRINCIPAL) THEN
1964 ASM_REWRITE_TAC[chi_0; COMPLEX_MUL_LID];
1965 REWRITE_TAC[COMPLEX_SUB_RZERO] THEN
1966 MP_TAC(SPECL [`d:num`; `c:num->complex`]
1967 BOUNDED_DIRICHLET_MANGOLDT_NONPRINCIPAL) THEN
1968 ASM_REWRITE_TAC[] THEN
1969 REWRITE_TAC[BOUNDED_POS] THEN MATCH_MP_TAC MONO_EXISTS THEN
1970 ONCE_REWRITE_TAC[SIMPLE_IMAGE_GEN] THEN
1971 REWRITE_TAC[FORALL_IN_IMAGE; IN_ELIM_THM; IN_UNIV] THEN
1972 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[COMPLEX_NORM_MUL] THEN
1973 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
1974 MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_REWRITE_TAC[NORM_POS_LE] THEN
1975 FIRST_ASSUM(fun th -> SIMP_TAC[MATCH_MP DIRICHLET_CHARACTER_NORM th]) THEN
1978 let DIRICHLET_MANGOLDT = prove
1979 (`!d k. 1 <= d /\ coprime(k,d)
1980 ==> bounded { Cx(&(phi d)) * vsum {n | n IN 1..x /\ (n == k) (mod d)}
1981 (\n. Cx(mangoldt n / &n)) -
1982 Cx(log(&x)) | x IN (:num)}`,
1983 REPEAT STRIP_TAC THEN
1984 SUBGOAL_THEN `?l. (k * l == 1) (mod d)` CHOOSE_TAC THENL
1985 [ASM_MESON_TAC[CONG_SOLVE]; ALL_TAC] THEN
1986 MP_TAC(SPECL [`d:num`; `l:num`] BOUNDED_SUM_OVER_DIRICHLET_CHARACTERS) THEN
1988 [ASM_REWRITE_TAC[] THEN UNDISCH_TAC `(k * l == 1) (mod d)` THEN
1989 CONV_TAC NUMBER_RULE;
1991 MATCH_MP_TAC EQ_IMP THEN AP_TERM_TAC THEN
1992 MATCH_MP_TAC(SET_RULE
1993 `(!x. x IN s ==> f x = g x) ==> {f x | x IN s} = {g x | x IN s}`) THEN
1994 X_GEN_TAC `x:num` THEN DISCH_THEN(K ALL_TAC) THEN
1995 AP_THM_TAC THEN AP_TERM_TAC THEN
1996 SIMP_TAC[GSYM VSUM_COMPLEX_LMUL; FINITE_NUMSEG; FINITE_RESTRICT] THEN
1997 SIMP_TAC[VSUM_RESTRICT_SET; FINITE_NUMSEG] THEN
1998 W(MP_TAC o PART_MATCH (lhs o rand) VSUM_SWAP o lhand o snd) THEN
1999 REWRITE_TAC[FINITE_DIRICHLET_CHARACTERS; FINITE_NUMSEG] THEN
2000 DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC VSUM_EQ_NUMSEG THEN
2001 X_GEN_TAC `n:num` THEN DISCH_TAC THEN REWRITE_TAC[COMPLEX_MUL_ASSOC] THEN
2002 MP_TAC(GSYM(SPEC `d:num` DIRICHLET_CHARACTER_MUL)) THEN
2003 SIMP_TAC[IN_ELIM_THM] THEN DISCH_THEN(K ALL_TAC) THEN
2004 SIMP_TAC[VSUM_COMPLEX_RMUL; FINITE_DIRICHLET_CHARACTERS] THEN
2005 ASM_SIMP_TAC[DIRICHLET_CHARACTER_SUM_OVER_CHARACTERS] THEN
2006 SUBGOAL_THEN `(l * n == 1) (mod d) <=> (n == k) (mod d)` SUBST1_TAC THENL
2007 [UNDISCH_TAC `(k * l == 1) (mod d)` THEN CONV_TAC NUMBER_RULE;
2008 COND_CASES_TAC THEN ASM_REWRITE_TAC[COMPLEX_MUL_LZERO; COMPLEX_VEC_0]]);;
2010 let DIRICHLET_MANGOLDT_EXPLICIT = prove
2011 (`!d k. 1 <= d /\ coprime (k,d)
2013 !x. abs(sum {n | n IN 1..x /\ (n == k) (mod d)}
2014 (\n. mangoldt n / &n) -
2015 log(&x) / &(phi d)) <= B`,
2016 REPEAT GEN_TAC THEN DISCH_TAC THEN
2017 FIRST_ASSUM(MP_TAC o MATCH_MP DIRICHLET_MANGOLDT) THEN
2018 REWRITE_TAC[BOUNDED_POS] THEN
2019 SIMP_TAC[SIMPLE_IMAGE; FORALL_IN_IMAGE; IN_UNIV] THEN
2020 SIMP_TAC[VSUM_CX; FINITE_RESTRICT; FINITE_NUMSEG;
2021 GSYM CX_SUB; GSYM CX_MUL; COMPLEX_NORM_CX] THEN
2022 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
2023 EXISTS_TAC `B / &(phi d)` THEN
2024 ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; LE_1; PHI_LOWERBOUND_1_STRONG;
2025 REAL_LE_RDIV_EQ] THEN
2026 X_GEN_TAC `n:num` THEN
2027 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [GSYM REAL_ABS_NUM] THEN
2028 REWRITE_TAC[GSYM REAL_ABS_MUL] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2029 ASM_SIMP_TAC[REAL_SUB_LDISTRIB; REAL_DIV_LMUL;
2030 LE_1; PHI_LOWERBOUND_1_STRONG; REAL_OF_NUM_EQ]);;
2032 let DIRICHLET_STRONG = prove
2033 (`!d k. 1 <= d /\ coprime(k,d)
2035 !x. abs(sum {p | p IN 1..x /\ prime p /\ (p == k) (mod d)}
2036 (\p. log(&p) / &p) -
2037 log(&x) / &(phi d)) <= B`,
2038 REPEAT GEN_TAC THEN DISCH_TAC THEN
2039 FIRST_ASSUM(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC o
2040 MATCH_MP DIRICHLET_MANGOLDT_EXPLICIT) THEN
2041 EXISTS_TAC `B + &3` THEN CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN
2042 X_GEN_TAC `x:num` THEN FIRST_X_ASSUM(MP_TAC o SPEC `x:num`) THEN
2043 MATCH_MP_TAC(REAL_ARITH
2044 `abs(x - y) <= a ==> abs(x - z) <= b ==> abs(y - z) <= b + a`) THEN
2045 MP_TAC(SPECL [`x:num`; `{n | n IN 1..x /\ (n == k) (mod d)}`]
2046 MERTENS_MANGOLDT_VERSUS_LOG) THEN
2047 SIMP_TAC[SUBSET; IN_ELIM_THM] THEN REWRITE_TAC[CONJ_ACI]);;
2049 (* ------------------------------------------------------------------------- *)
2050 (* Ignore the density details and prove the main result. *)
2051 (* ------------------------------------------------------------------------- *)
2053 let DIRICHLET = prove
2054 (`!d k. 1 <= d /\ coprime(k,d)
2055 ==> INFINITE {p | prime p /\ (p == k) (mod d)}`,
2056 REWRITE_TAC[INFINITE] THEN REPEAT STRIP_TAC THEN
2057 FIRST_ASSUM(MP_TAC o SPEC `\n:num. n` o MATCH_MP UPPER_BOUND_FINITE_SET) THEN
2058 REWRITE_TAC[IN_ELIM_THM; NOT_EXISTS_THM] THEN X_GEN_TAC `n:num` THEN
2059 DISCH_TAC THEN MP_TAC(SPECL [`d:num`; `k:num`] DIRICHLET_STRONG) THEN
2060 ASM_REWRITE_TAC[] THEN
2061 DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN
2063 `max (exp(&(phi d) *
2064 (&1 + B + sum {p | p IN 1..n /\ prime p /\ (p == k) (mod d)}
2065 (\p. log(&p) / &p))))
2067 REAL_ARCH_SIMPLE) THEN
2068 REWRITE_TAC[NOT_EXISTS_THM; REAL_MAX_LE; REAL_OF_NUM_LE] THEN
2069 X_GEN_TAC `m:num` THEN STRIP_TAC THEN
2070 FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN
2071 DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH
2072 `abs(x - y) <= b ==> y < &1 + b + x`)) THEN
2073 ASM_SIMP_TAC[REAL_NOT_LT; REAL_LE_RDIV_EQ; PHI_LOWERBOUND_1_STRONG;
2074 REAL_OF_NUM_LT; LE_1] THEN
2075 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
2076 ONCE_REWRITE_TAC[GSYM REAL_EXP_MONO_LE] THEN
2077 ASM_SIMP_TAC[EXP_LOG; REAL_OF_NUM_LT; LE_1] THEN
2078 FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REAL_ARITH
2079 `x <= a ==> x = y ==> y <= a`)) THEN
2080 REPLICATE_TAC 4 AP_TERM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN
2081 REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_NUMSEG] THEN
2082 GEN_TAC THEN EQ_TAC THEN ASM_SIMP_TAC[] THEN ASM_ARITH_TAC);;