1 (* ========================================================================= *)
2 (* Multiplicative functions into N or R (could add Z, C etc.) *)
3 (* ========================================================================= *)
5 needs "Library/prime.ml";;
6 needs "Library/pocklington.ml";;
8 (* ------------------------------------------------------------------------- *)
9 (* Definition of multiplicativity of functions into N. *)
10 (* ------------------------------------------------------------------------- *)
12 let multiplicative = new_definition
14 f(1) = 1 /\ !m n. coprime(m,n) ==> f(m * n) = f(m) * f(n)`;;
16 let MULTIPLICATIVE_1 = prove
17 (`!f. multiplicative f ==> f(1) = 1`,
18 SIMP_TAC[multiplicative]);;
20 (* ------------------------------------------------------------------------- *)
21 (* We can really ignore the value at zero. *)
22 (* ------------------------------------------------------------------------- *)
24 let MULTIPLICATIVE = prove
25 (`multiplicative f <=>
27 !m n. ~(m = 0) /\ ~(n = 0) /\ coprime(m,n) ==> f(m * n) = f(m) * f(n)`,
28 REWRITE_TAC[multiplicative] THEN EQ_TAC THEN
29 STRIP_TAC THEN ASM_SIMP_TAC[] THEN
30 MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN
31 ASM_CASES_TAC `n = 0` THEN ASM_SIMP_TAC[MULT_CLAUSES] THEN
32 ONCE_REWRITE_TAC[COPRIME_SYM] THEN
33 ASM_CASES_TAC `m = 0` THEN ASM_SIMP_TAC[MULT_CLAUSES] THEN
34 ASM_MESON_TAC[COPRIME_SYM; COPRIME_0; DIVIDES_ONE; MULT_CLAUSES]);;
36 let MULTIPLICATIVE_IGNOREZERO = prove
37 (`!f g. (!n. ~(n = 0) ==> g(n) = f(n)) /\ multiplicative f
38 ==> multiplicative g`,
39 REPEAT GEN_TAC THEN SIMP_TAC[MULTIPLICATIVE; ARITH_EQ] THEN
40 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
41 REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN
42 DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN
43 ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[MULT_EQ_0]);;
45 (* ------------------------------------------------------------------------- *)
46 (* A key "building block" theorem. *)
47 (* ------------------------------------------------------------------------- *)
50 let MULTIPLICATIVE_CONVOLUTION = prove
51 (`!f g. multiplicative f /\ multiplicative g
52 ==> multiplicative (\n. nsum {d | d divides n}
53 (\d. f(d) * g(n DIV d)))`,
55 GEN_REWRITE_TAC (LAND_CONV o BINOP_CONV) [multiplicative] THEN
56 REWRITE_TAC[MULTIPLICATIVE; GSYM NSUM_LMUL] THEN STRIP_TAC THEN
57 ASM_REWRITE_TAC[DIVIDES_ONE; DIV_1; SING_GSPEC; NSUM_SING; MULT_CLAUSES] THEN
58 MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN STRIP_TAC THEN
59 GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [MULT_SYM] THEN
60 ASM_SIMP_TAC[GSYM NSUM_LMUL; NSUM_NSUM_PRODUCT; FINITE_DIVISORS] THEN
61 CONV_TAC SYM_CONV THEN MATCH_MP_TAC NSUM_EQ_GENERAL THEN
62 EXISTS_TAC `\(a:num,b). a * b` THEN REWRITE_TAC[EXISTS_UNIQUE_DEF] THEN
63 REWRITE_TAC[FORALL_PAIR_THM; EXISTS_PAIR_THM; IN_ELIM_PAIR_THM] THEN
64 CONV_TAC(ONCE_DEPTH_CONV GEN_BETA_CONV) THEN REWRITE_TAC[IN_ELIM_THM] THEN
65 REWRITE_TAC[PAIR_EQ] THEN CONJ_TAC THENL
66 [GEN_TAC THEN DISCH_THEN(ASSUME_TAC o MATCH_MP DIVISION_DECOMP) THEN
67 CONJ_TAC THENL [ASM_MESON_TAC[MULT_SYM]; ALL_TAC] THEN
68 MAP_EVERY X_GEN_TAC [`a1:num`; `b1:num`; `a2:num`; `b2:num`] THEN
69 STRIP_TAC THEN FIRST_X_ASSUM(SUBST_ALL_TAC o SYM) THEN
70 REWRITE_TAC[GSYM DIVIDES_ANTISYM] THEN REPEAT CONJ_TAC THEN
71 MATCH_MP_TAC COPRIME_DIVPROD THENL
72 (map EXISTS_TAC [`b2:num`; `b1:num`; `a2:num`; `a1:num`]) THEN
73 ASM_MESON_TAC[COPRIME_DIVISORS; DIVIDES_REFL;
74 DIVIDES_RMUL; COPRIME_SYM; MULT_SYM];
75 MAP_EVERY X_GEN_TAC [`d:num`; `e:num`] THEN STRIP_TAC THEN
76 CONJ_TAC THENL [ASM_MESON_TAC[DIVIDES_MUL2; MULT_SYM]; ALL_TAC] THEN
77 MP_TAC(REWRITE_RULE[divides] (ASSUME `(d:num) divides n`)) THEN
78 DISCH_THEN(X_CHOOSE_THEN `d':num` SUBST_ALL_TAC) THEN
79 MP_TAC(REWRITE_RULE[divides] (ASSUME `(e:num) divides m`)) THEN
80 DISCH_THEN(X_CHOOSE_THEN `e':num` SUBST_ALL_TAC) THEN
81 RULE_ASSUM_TAC(REWRITE_RULE[MULT_EQ_0; DE_MORGAN_THM]) THEN
82 ONCE_REWRITE_TAC[AC MULT_AC
83 `(e * e') * d * d':num = (d * e) * (d' * e')`] THEN
84 ASM_SIMP_TAC[DIV_MULT; MULT_EQ_0] THEN
85 FIRST_ASSUM(ASSUME_TAC o MATCH_MP (NUMBER_RULE
86 `coprime(a * b,c * d) ==> coprime(c,a) /\ coprime(d,b)`)) THEN
87 ASM_SIMP_TAC[] THEN ARITH_TAC]);;
89 let MULTIPLICATIVE_CONST = prove
90 (`!c. multiplicative(\n. c) <=> c = 1`,
91 GEN_TAC THEN REWRITE_TAC[multiplicative] THEN
92 ASM_CASES_TAC `c = 1` THEN ASM_REWRITE_TAC[MULT_CLAUSES]);;
94 let MULTIPLICATIVE_DELTA = prove
95 (`multiplicative(\n. if n = 1 then 1 else 0)`,
96 REWRITE_TAC[MULTIPLICATIVE; MULT_EQ_1] THEN ARITH_TAC);;
98 let MULTIPLICATIVE_DIVISORSUM = prove
99 (`!f. multiplicative f ==> multiplicative (\n. nsum {d | d divides n} f)`,
100 REPEAT STRIP_TAC THEN
101 MP_TAC(ISPECL [`f:num->num`; `\n:num. 1`] MULTIPLICATIVE_CONVOLUTION) THEN
102 ASM_REWRITE_TAC[MULT_CLAUSES; MULTIPLICATIVE_CONST; ETA_AX]);;
104 (* ------------------------------------------------------------------------- *)
105 (* Some particular multiplicative functions. *)
106 (* ------------------------------------------------------------------------- *)
108 let MULTIPLICATIVE_ID = prove
109 (`multiplicative(\n. n)`,
110 REWRITE_TAC[multiplicative]);;
112 let MULTIPLICATIVE_POWERSUM = prove
113 (`!k. multiplicative(\n. nsum {d | d divides n} (\d. d EXP k))`,
114 GEN_TAC THEN MATCH_MP_TAC MULTIPLICATIVE_DIVISORSUM THEN
115 REWRITE_TAC[MULTIPLICATIVE; EXP_ONE; MULT_EXP]);;
117 let sigma = new_definition
118 `sigma(n) = if n = 0 then 0 else nsum {d | d divides n} (\i. i)`;;
120 let tau = new_definition
121 `tau(n) = if n = 0 then 0 else CARD {d | d divides n}`;;
123 let MULTIPLICATIVE_SIGMA = prove
124 (`multiplicative(sigma)`,
125 MP_TAC(SPEC `1` MULTIPLICATIVE_POWERSUM) THEN
126 MATCH_MP_TAC(REWRITE_RULE[GSYM IMP_IMP] MULTIPLICATIVE_IGNOREZERO) THEN
127 SIMP_TAC[sigma; EXP_1]);;
129 let MULTIPLICATIVE_TAU = prove
130 (`multiplicative(tau)`,
131 MP_TAC(SPEC `0` MULTIPLICATIVE_POWERSUM) THEN
132 MATCH_MP_TAC(REWRITE_RULE[GSYM IMP_IMP] MULTIPLICATIVE_IGNOREZERO) THEN
133 SIMP_TAC[tau; EXP; NSUM_CONST; MULT_CLAUSES; FINITE_DIVISORS]);;
135 let MULTIPLICATIVE_PHI = prove
136 (`multiplicative(phi)`,
137 REWRITE_TAC[multiplicative; PHI_MULTIPLICATIVE; PHI_1]);;
139 let MULTIPLICATIVE_GCD = prove
140 (`!n. multiplicative(\m. gcd(n,m))`,
141 REWRITE_TAC[multiplicative; ONCE_REWRITE_RULE[GCD_SYM] GCD_1] THEN
142 ONCE_REWRITE_TAC[GSYM DIVIDES_ANTISYM] THEN NUMBER_TAC);;
144 (* ------------------------------------------------------------------------- *)
145 (* Uniqueness of multiplicative functions if equal on prime powers. *)
146 (* ------------------------------------------------------------------------- *)
148 let MULTIPLICATIVE_UNIQUE = prove
149 (`!f g. multiplicative f /\ multiplicative g /\
150 (!p k. prime p ==> f(p EXP k) = g(p EXP k))
151 ==> !n. ~(n = 0) ==> f n = g n`,
152 REPEAT GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC num_WF THEN
153 X_GEN_TAC `n:num` THEN REPEAT STRIP_TAC THEN
154 FIRST_X_ASSUM(DISJ_CASES_THEN2 ASSUME_TAC MP_TAC o MATCH_MP (ARITH_RULE
155 `~(n = 0) ==> n = 1 \/ 1 < n`))
156 THENL [ASM_MESON_TAC[multiplicative]; ALL_TAC] THEN
157 SPEC_TAC(`n:num`,`n:num`) THEN MATCH_MP_TAC INDUCT_COPRIME_STRONG THEN
158 ASM_MESON_TAC[multiplicative]);;
160 (* ------------------------------------------------------------------------- *)
161 (* Derive the divisor-sum identity for phi from this. *)
162 (* ------------------------------------------------------------------------- *)
164 let PHI_DIVISORSUM = prove
165 (`!n. ~(n = 0) ==> nsum {d | d divides n} (\d. phi(d)) = n`,
166 MATCH_MP_TAC MULTIPLICATIVE_UNIQUE THEN REWRITE_TAC[MULTIPLICATIVE_ID] THEN
167 SIMP_TAC[MULTIPLICATIVE_DIVISORSUM; ETA_AX; MULTIPLICATIVE_PHI] THEN
168 SIMP_TAC[DIVIDES_PRIMEPOW; SET_RULE
169 `{d | ?i. i <= k /\ d = p EXP i} = IMAGE (\i. p EXP i) {i | i <= k}`] THEN
170 SIMP_TAC[NSUM_IMAGE; EQ_PRIMEPOW; o_DEF; PHI_PRIMEPOW] THEN
171 REWRITE_TAC[RIGHT_FORALL_IMP_THM] THEN GEN_TAC THEN DISCH_TAC THEN
172 INDUCT_TAC THEN REWRITE_TAC[LE; NOT_SUC] THEN
173 REWRITE_TAC[CONJUNCT1 EXP; SET_RULE `{x | x = 0} = {0}`; NSUM_SING] THEN
174 REWRITE_TAC[SET_RULE `{i | i = a \/ i <= b} = a INSERT {i | i <= b}`] THEN
175 ASM_SIMP_TAC[NSUM_CLAUSES; FINITE_NUMSEG_LE; NOT_SUC] THEN
176 REWRITE_TAC[IN_ELIM_THM; SUC_SUB1; ARITH_RULE `~(SUC k <= k)`] THEN
177 MATCH_MP_TAC(ARITH_RULE `a:num <= b ==> b - a + a = b`) THEN
178 ASM_SIMP_TAC[LE_EXP; PRIME_IMP_NZ] THEN ARITH_TAC);;
180 (* ------------------------------------------------------------------------- *)
181 (* Now the real analog. *)
182 (* ------------------------------------------------------------------------- *)
184 let real_multiplicative = new_definition
185 `real_multiplicative (f:num->real) <=>
186 f(1) = &1 /\ !m n. coprime(m,n) ==> f(m * n) = f(m) * f(n)`;;
188 let REAL_MULTIPLICATIVE = prove
189 (`real_multiplicative f <=>
191 !m n. ~(m = 0) /\ ~(n = 0) /\ coprime(m,n) ==> f(m * n) = f(m) * f(n)`,
192 REWRITE_TAC[real_multiplicative] THEN EQ_TAC THEN
193 STRIP_TAC THEN ASM_SIMP_TAC[] THEN
194 MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN
195 ASM_CASES_TAC `n = 0` THEN
196 ASM_SIMP_TAC[COPRIME_0; MULT_CLAUSES; REAL_MUL_LID] THEN
197 ONCE_REWRITE_TAC[COPRIME_SYM] THEN
198 ASM_CASES_TAC `m = 0` THEN
199 ASM_SIMP_TAC[COPRIME_0; MULT_CLAUSES; REAL_MUL_RID] THEN
200 ASM_MESON_TAC[COPRIME_SYM; COPRIME_0; DIVIDES_ONE; MULT_CLAUSES]);;
202 let REAL_MULTIPLICATIVE_CONST = prove
203 (`!c. real_multiplicative(\n. c) <=> c = &1`,
204 GEN_TAC THEN REWRITE_TAC[real_multiplicative] THEN
205 ASM_CASES_TAC `c:real = &1` THEN ASM_REWRITE_TAC[REAL_MUL_LID]);;
207 let REAL_MULTIPLICATIVE_DELTA = prove
208 (`real_multiplicative(\n. if n = 1 then &1 else &0)`,
209 REWRITE_TAC[REAL_MULTIPLICATIVE; MULT_EQ_1] THEN REAL_ARITH_TAC);;
211 let REAL_MULTIPLICATIVE_IGNOREZERO = prove
212 (`!f g. (!n. ~(n = 0) ==> g(n) = f(n)) /\ real_multiplicative f
213 ==> real_multiplicative g`,
214 REPEAT GEN_TAC THEN SIMP_TAC[REAL_MULTIPLICATIVE; ARITH_EQ] THEN
215 REPEAT(DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
216 REPEAT(MATCH_MP_TAC MONO_FORALL THEN GEN_TAC) THEN
217 DISCH_THEN(fun th -> STRIP_TAC THEN MP_TAC th) THEN
218 ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[MULT_EQ_0]);;
220 let REAL_MULTIPLICATIVE_CONVOLUTION = prove
221 (`!f g. real_multiplicative f /\ real_multiplicative g
222 ==> real_multiplicative (\n. sum {d | d divides n}
223 (\d. f(d) * g(n DIV d)))`,
225 GEN_REWRITE_TAC (LAND_CONV o BINOP_CONV) [real_multiplicative] THEN
226 REWRITE_TAC[REAL_MULTIPLICATIVE; GSYM SUM_LMUL] THEN STRIP_TAC THEN
227 ASM_REWRITE_TAC[DIVIDES_ONE; DIV_1; SING_GSPEC; SUM_SING; REAL_MUL_LID] THEN
228 MAP_EVERY X_GEN_TAC [`m:num`; `n:num`] THEN STRIP_TAC THEN
229 GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [REAL_MUL_SYM] THEN
230 ASM_SIMP_TAC[GSYM SUM_LMUL; SUM_SUM_PRODUCT; FINITE_DIVISORS] THEN
231 CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_EQ_GENERAL THEN
232 EXISTS_TAC `\(a:num,b). a * b` THEN REWRITE_TAC[EXISTS_UNIQUE_DEF] THEN
233 REWRITE_TAC[FORALL_PAIR_THM; EXISTS_PAIR_THM; IN_ELIM_PAIR_THM] THEN
234 REWRITE_TAC[IN_ELIM_THM; PAIR_EQ] THEN CONJ_TAC THENL
235 [GEN_TAC THEN DISCH_THEN(ASSUME_TAC o MATCH_MP DIVISION_DECOMP) THEN
236 CONJ_TAC THENL [ASM_MESON_TAC[MULT_SYM]; ALL_TAC] THEN
237 MAP_EVERY X_GEN_TAC [`a1:num`; `b1:num`; `a2:num`; `b2:num`] THEN
238 STRIP_TAC THEN FIRST_X_ASSUM(SUBST_ALL_TAC o SYM) THEN
239 REWRITE_TAC[GSYM DIVIDES_ANTISYM] THEN REPEAT CONJ_TAC THEN
240 MATCH_MP_TAC COPRIME_DIVPROD THENL
241 (map EXISTS_TAC [`b2:num`; `b1:num`; `a2:num`; `a1:num`]) THEN
242 ASM_MESON_TAC[COPRIME_DIVISORS; DIVIDES_REFL;
243 DIVIDES_RMUL; COPRIME_SYM; MULT_SYM];
244 MAP_EVERY X_GEN_TAC [`d:num`; `e:num`] THEN STRIP_TAC THEN
245 CONJ_TAC THENL [ASM_MESON_TAC[DIVIDES_MUL2; MULT_SYM]; ALL_TAC] THEN
246 MP_TAC(REWRITE_RULE[divides] (ASSUME `(d:num) divides n`)) THEN
247 DISCH_THEN(X_CHOOSE_THEN `d':num` SUBST_ALL_TAC) THEN
248 MP_TAC(REWRITE_RULE[divides] (ASSUME `(e:num) divides m`)) THEN
249 DISCH_THEN(X_CHOOSE_THEN `e':num` SUBST_ALL_TAC) THEN
250 RULE_ASSUM_TAC(REWRITE_RULE[MULT_EQ_0; DE_MORGAN_THM]) THEN
251 ONCE_REWRITE_TAC[AC MULT_AC
252 `(e * e') * d * d':num = (d * e) * (d' * e')`] THEN
253 ASM_SIMP_TAC[DIV_MULT; MULT_EQ_0] THEN
254 FIRST_ASSUM(ASSUME_TAC o MATCH_MP (NUMBER_RULE
255 `coprime(a * b,c * d) ==> coprime(c,a) /\ coprime(d,b)`)) THEN
256 ASM_SIMP_TAC[] THEN REAL_ARITH_TAC]);;
258 let REAL_MULTIPLICATIVE_DIVISORSUM = prove
259 (`!f. real_multiplicative f
260 ==> real_multiplicative (\n. sum {d | d divides n} f)`,
261 REPEAT STRIP_TAC THEN
262 MP_TAC(ISPECL [`f:num->real`; `(\n. &1):num->real`]
263 REAL_MULTIPLICATIVE_CONVOLUTION) THEN
264 ASM_REWRITE_TAC[REAL_MUL_RID; REAL_MULTIPLICATIVE_CONST; ETA_AX]);;
266 (* ------------------------------------------------------------------------- *)
267 (* The Mobius function (into the reals). *)
268 (* ------------------------------------------------------------------------- *)
272 let mobius = new_definition
273 `mobius(n) = if ?p. prime p /\ (p EXP 2) divides n then &0
274 else --(&1) pow CARD {p | prime p /\ p divides n}`;;
278 REWRITE_TAC[mobius] THEN MP_TAC(SPEC `2 EXP 2` DIVIDES_0) THEN
279 MESON_TAC[PRIME_2]);;
283 REWRITE_TAC[mobius; DIVIDES_ONE; EXP_EQ_1; ARITH] THEN
284 COND_CASES_TAC THENL [ASM_MESON_TAC[PRIME_1]; ALL_TAC] THEN
285 SUBGOAL_THEN `{p | prime p /\ p = 1} = {}`
286 (fun th -> SIMP_TAC[th; CARD_CLAUSES; real_pow]) THEN SET_TAC[PRIME_1]);;
288 let REAL_ABS_MOBIUS = prove
289 (`!n. abs(mobius n) <= &1`,
290 GEN_TAC THEN REWRITE_TAC[mobius] THEN COND_CASES_TAC THEN
291 REWRITE_TAC[REAL_ABS_POW; REAL_ABS_NEG; REAL_POW_ONE; REAL_ABS_NUM] THEN
292 CONV_TAC REAL_RAT_REDUCE_CONV);;
294 let MOBIUS_MULT = prove
295 (`!a b. coprime(a,b) ==> mobius(a * b) = mobius a * mobius b`,
296 REPEAT STRIP_TAC THEN REWRITE_TAC[mobius] THEN
297 ASM_CASES_TAC `?p. prime p /\ (p EXP 2) divides a` THENL
298 [ASM_CASES_TAC `?p. prime p /\ p EXP 2 divides (a * b)` THEN
299 ASM_REWRITE_TAC[REAL_MUL_LZERO] THEN ASM_MESON_TAC[DIVIDES_RMUL];
301 ASM_CASES_TAC `?p. prime p /\ (p EXP 2) divides b` THENL
302 [ASM_CASES_TAC `?p. prime p /\ p EXP 2 divides (a * b)` THEN
303 ASM_REWRITE_TAC[REAL_MUL_RZERO] THEN ASM_MESON_TAC[DIVIDES_LMUL];
305 ASM_CASES_TAC `?p. prime p /\ p EXP 2 divides (a * b)` THENL
306 [ASM_MESON_TAC[PRIME_DIVPROD_POW]; ALL_TAC] THEN
307 ASM_REWRITE_TAC[GSYM REAL_POW_ADD] THEN AP_TERM_TAC THEN
308 CONV_TAC SYM_CONV THEN MATCH_MP_TAC CARD_UNION_EQ THEN
309 ASM_CASES_TAC `a = 0` THENL [ASM_MESON_TAC[PRIME_2; DIVIDES_0]; ALL_TAC] THEN
310 ASM_CASES_TAC `b = 0` THENL [ASM_MESON_TAC[PRIME_2; DIVIDES_0]; ALL_TAC] THEN
312 [MATCH_MP_TAC FINITE_SUBSET THEN EXISTS_TAC `{p | p divides a * b}` THEN
313 ASM_SIMP_TAC[FINITE_DIVISORS; MULT_EQ_0] THEN SET_TAC[];
314 SIMP_TAC[EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_UNION; AND_FORALL_THM] THEN
315 X_GEN_TAC `p:num` THEN REWRITE_TAC[IN_ELIM_THM] THEN
316 UNDISCH_TAC `~(?p. prime p /\ p EXP 2 divides a * b)` THEN
317 REWRITE_TAC[NOT_EXISTS_THM] THEN DISCH_THEN(MP_TAC o SPEC `p:num`) THEN
318 ASM_CASES_TAC `prime p` THEN ASM_SIMP_TAC[PRIME_DIVPROD_EQ] THEN
319 REWRITE_TAC[CONTRAPOS_THM; EXP_2] THEN CONV_TAC NUMBER_RULE]);;
321 let REAL_MULTIPLICATIVE_MOBIUS = prove
322 (`real_multiplicative mobius`,
323 SIMP_TAC[real_multiplicative; MOBIUS_1; MOBIUS_MULT]);;
325 let MOBIUS_PRIME = prove
326 (`!p. prime p ==> mobius(p) = -- &1`,
327 REPEAT STRIP_TAC THEN REWRITE_TAC[mobius] THEN COND_CASES_TAC THENL
328 [FIRST_X_ASSUM(X_CHOOSE_THEN `q:num`
329 (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN
330 DISCH_THEN(fun th -> MP_TAC th THEN ASSUME_TAC
331 (MATCH_MP(NUMBER_RULE `q EXP 2 divides p ==> q divides p`) th)) THEN
332 SUBGOAL_THEN `q:num = p` SUBST_ALL_TAC THENL
333 [ASM_MESON_TAC[DIVIDES_PRIME_PRIME]; ALL_TAC] THEN
334 DISCH_THEN(MP_TAC o MATCH_MP DIVIDES_LE) THEN
335 REWRITE_TAC[ARITH_RULE `p EXP 2 <= p <=> p * p <= 1 * p`] THEN
336 REWRITE_TAC[LE_MULT_RCANCEL] THEN
337 FIRST_ASSUM(MP_TAC o MATCH_MP PRIME_GE_2) THEN ARITH_TAC;
338 SUBGOAL_THEN `{q | prime q /\ q divides p} = {p}` SUBST1_TAC THENL
339 [ASM SET_TAC[DIVIDES_PRIME_PRIME]; ALL_TAC] THEN
340 SIMP_TAC[CARD_CLAUSES; FINITE_RULES; NOT_IN_EMPTY; ARITH; REAL_POW_1]]);;
342 let MOBIUS_PRIMEPOW = prove
343 (`!p k. prime p ==> mobius(p EXP k) = if k = 0 then &1
344 else if k = 1 then -- &1
346 REPEAT STRIP_TAC THEN
347 ASM_CASES_TAC `k = 0` THEN ASM_REWRITE_TAC[EXP; MOBIUS_1] THEN
348 ASM_CASES_TAC `k = 1` THEN ASM_SIMP_TAC[EXP_1; MOBIUS_PRIME] THEN
349 REWRITE_TAC[mobius] THEN
350 SUBGOAL_THEN `?q. prime q /\ q EXP 2 divides p EXP k`
351 (fun th -> REWRITE_TAC[th]) THEN
352 EXISTS_TAC `p:num` THEN ASM_SIMP_TAC[DIVIDES_PRIME_EXP_LE] THEN
355 let DIVISORSUM_MOBIUS = prove
357 ==> sum {d | d divides n} (\d. mobius d) = if n = 1 then &1 else &0`,
358 REWRITE_TAC[ARITH_RULE `1 <= n <=> n = 1 \/ 1 < n`] THEN
359 REWRITE_TAC[TAUT `(a \/ b ==> c) <=> (a ==> c) /\ (b ==> c)`] THEN
360 SIMP_TAC[DIVIDES_ONE; SET_RULE `{x | x = a} = {a}`; SUM_SING; MOBIUS_1] THEN
361 SIMP_TAC[ARITH_RULE `1 < n ==> ~(n = 1)`] THEN
362 MATCH_MP_TAC INDUCT_COPRIME_STRONG THEN CONJ_TAC THENL
363 [MP_TAC(MATCH_MP REAL_MULTIPLICATIVE_DIVISORSUM
364 REAL_MULTIPLICATIVE_MOBIUS) THEN
365 SIMP_TAC[real_multiplicative; ETA_AX; REAL_MUL_LZERO];
367 MAP_EVERY X_GEN_TAC [`p:num`; `k:num`] THEN STRIP_TAC THEN
368 MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC `sum {1,p} (\d. mobius d)` THEN
371 ASM_SIMP_TAC[SUM_CLAUSES; FINITE_RULES; NOT_IN_EMPTY; IN_SING;
372 MOBIUS_PRIME; MOBIUS_1; REAL_ADD_RID; REAL_ADD_RINV] THEN
373 ASM_MESON_TAC[PRIME_1]] THEN
374 MATCH_MP_TAC SUM_SUPERSET THEN ASM_SIMP_TAC[DIVIDES_PRIMEPOW] THEN
375 REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY; DE_MORGAN_THM] THEN
376 REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THENL
377 [ASM_MESON_TAC[EXP; LE_0];
378 ASM_MESON_TAC[EXP_1; LE_1];
379 ASM_SIMP_TAC[MOBIUS_PRIMEPOW] THEN ASM_MESON_TAC[EXP; EXP_1]]);;
381 let MOBIUS_INVERSION = prove
382 (`!f g. (!n. 1 <= n ==> g(n) = sum {d | d divides n} f)
384 ==> f(n) = sum {d | d divides n} (\d. mobius(d) * g(n DIV d))`,
385 REPEAT STRIP_TAC THEN
386 SUBGOAL_THEN `!d. d divides n ==> ~(n DIV d = 0)` ASSUME_TAC THENL
387 [GEN_TAC THEN ASM_CASES_TAC `d = 0` THEN
388 ASM_SIMP_TAC[DIVIDES_ZERO; LE_1] THEN
389 DISCH_THEN(MP_TAC o MATCH_MP DIVIDES_LE) THEN
390 ASM_SIMP_TAC[LE_1; NOT_LT; DIV_EQ_0];
392 ASM_SIMP_TAC[LE_1] THEN
393 MATCH_MP_TAC EQ_TRANS THEN EXISTS_TAC
394 `sum {d | d divides n} (\d. f(d) * (if n DIV d = 1 then &1 else &0))` THEN
396 [MATCH_MP_TAC EQ_TRANS THEN
397 EXISTS_TAC `sum {n} (\d. f(d) * (if n DIV d = 1 then &1 else &0))` THEN
399 [ASM_SIMP_TAC[SUM_SING; DIV_REFL; LE_1; REAL_MUL_RID]; ALL_TAC] THEN
400 CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_SUPERSET THEN
401 SIMP_TAC[SUBSET; IN_SING; IN_ELIM_THM; DIVIDES_REFL] THEN
402 X_GEN_TAC `d:num` THEN REWRITE_TAC[DIVIDES_DIV_MULT] THEN
403 DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN
404 COND_CASES_TAC THEN ASM_REWRITE_TAC[MULT_CLAUSES; REAL_MUL_RZERO];
405 ASM_SIMP_TAC[GSYM DIVISORSUM_MOBIUS; LE_1] THEN
406 REWRITE_TAC[GSYM SUM_LMUL] THEN
407 ASM_SIMP_TAC[SUM_SUM_PRODUCT; FINITE_DIVISORS; LE_1; IN_ELIM_THM] THEN
408 MATCH_MP_TAC SUM_EQ_GENERAL_INVERSES THEN
409 REPEAT(EXISTS_TAC `\(m:num,n:num). (n,m)`) THEN
410 REWRITE_TAC[FORALL_PAIR_THM; IN_ELIM_PAIR_THM] THEN
411 CONJ_TAC THEN REPEAT GEN_TAC THEN
412 DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN
413 REWRITE_TAC[REAL_MUL_SYM] THEN
414 ASM_MESON_TAC[DIVIDES_DIVIDES_DIV; MULT_SYM;
415 NUMBER_RULE `(a * b) divides c ==> b divides c`]]);;