1 (* ========================================================================= *)
2 (* Pi series in Bailey/Borwein/Plouffe "polylogarithmic constants" paper. *)
3 (* ========================================================================= *)
5 needs "Library/transc.ml";;
7 let FACTOR_1X4_LEMMA = prove
8 (`!x. (x * x + x * sqrt (&2) + &1) * (x * x - x * sqrt (&2) + &1) =
10 REWRITE_TAC[REAL_ARITH
11 `(a + b + c) * (a - b + c) = &2 * a * c + a * a - b * b + c * c`] THEN
12 REWRITE_TAC[REAL_ARITH
13 `&2 * (x * x) * &1 + a - (x * s) * x * s + &1 * &1 =
14 (&2 - s * s) * x * x + (&1 + a)`] THEN
15 SIMP_TAC[REWRITE_RULE[REAL_POW_2] SQRT_POW_2; REAL_POS] THEN
16 REWRITE_TAC[REAL_SUB_REFL; REAL_MUL_LZERO; REAL_ADD_LID] THEN
17 SUBST1_TAC(SYM(NUM_REDUCE_CONV `SUC(SUC(SUC(SUC 0)))`)) THEN
18 REWRITE_TAC[real_pow; REAL_MUL_ASSOC; REAL_MUL_RID]);;
20 let MAGIC_DERIVATIVE = prove
22 ==> ((\x. ln((x - &1) pow 2) +
24 ln((x pow 2 + x * sqrt(&2) + &1) /
25 (x pow 2 - x * sqrt(&2) + &1)) +
26 &2 * atn(x * sqrt(&2) + &1) +
27 &2 * atn(x * sqrt(&2) - &1) +
30 diffl ((&4 * sqrt(&2) -
32 &4 * sqrt(&2) * x pow 4 -
33 &8 * x pow 5) / (&1 - x pow 8)))(x)`,
35 W(MP_TAC o SPEC `x:real` o DIFF_CONV o lhand o rator o snd) THEN
36 REWRITE_TAC[IMP_IMP] THEN
38 `a /\ (a ==> (b <=> c)) ==> (a ==> b) ==> c`) THEN
40 [REWRITE_TAC[GSYM CONJ_ASSOC] THEN
42 `a /\ (a ==> c) /\ (a /\ c ==> b) /\ d /\ e
43 ==> e /\ d /\ b /\ a /\ c`) THEN
45 [MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < x + &1`) THEN
46 SUBST1_TAC(SYM(NUM_REDUCE_CONV `2 + 2`)) THEN
47 REWRITE_TAC[REAL_POW_ADD; REAL_LE_SQUARE];
48 GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [REAL_ADD_SYM] THEN
49 ONCE_REWRITE_TAC[GSYM FACTOR_1X4_LEMMA] THEN
50 DISCH_THEN(MP_TAC o MATCH_MP REAL_LT_IMP_NZ) THEN
51 SIMP_TAC[REAL_POW_2; REAL_ENTIRE; DE_MORGAN_THM];
53 MATCH_MP_TAC REAL_LTE_TRANS THEN
54 EXISTS_TAC `inv((x pow 2 - x * sqrt (&2) + &1) *
55 (x pow 2 - x * sqrt (&2) + &1)) *
56 ((x pow 2 - x * sqrt (&2) + &1) *
57 (x pow 2 - x * sqrt (&2) + &1)) *
58 (x pow 2 + x * sqrt (&2) + &1) /
59 (x pow 2 - x * sqrt (&2) + &1)` THEN
61 [MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL
62 [REWRITE_TAC[REAL_LT_INV_EQ; GSYM REAL_POW_2] THEN
63 ASM_REWRITE_TAC[REAL_ARITH `&0 < x <=> &0 <= x /\ ~(x = &0)`;
65 REWRITE_TAC[REAL_LE_SQUARE; REAL_POW_2]; ALL_TAC] THEN
66 ASM_SIMP_TAC[GSYM REAL_MUL_ASSOC; REAL_DIV_LMUL] THEN
67 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
68 REWRITE_TAC[REAL_POW_2; FACTOR_1X4_LEMMA] THEN
69 MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < &1 + x`) THEN
70 SUBST1_TAC(SYM(NUM_REDUCE_CONV `2 + 2`)) THEN
71 REWRITE_TAC[REAL_POW_ADD; REAL_LE_SQUARE];
73 ONCE_REWRITE_TAC[REAL_MUL_ASSOC] THEN
74 ASM_SIMP_TAC[REAL_MUL_LINV; REAL_ENTIRE; DE_MORGAN_THM] THEN
75 REWRITE_TAC[REAL_LE_REFL; REAL_MUL_LID];
76 REWRITE_TAC[REAL_ARITH `&0 < x <=> &0 <= x /\ ~(x = &0)`] THEN
77 REWRITE_TAC[REAL_POW_2; REAL_LE_SQUARE; REAL_ENTIRE] THEN
78 UNDISCH_TAC `abs(x) < &1` THEN REAL_ARITH_TAC;
79 REWRITE_TAC[REAL_ARITH `&0 < x <=> &0 <= x /\ ~(x = &0)`] THEN
80 REWRITE_TAC[REAL_POW_2; REAL_LE_SQUARE; REAL_ENTIRE] THEN
81 UNDISCH_TAC `abs(x) < &1` THEN REAL_ARITH_TAC];
84 CONV_TAC NUM_REDUCE_CONV THEN
85 REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_MUL_LID; REAL_MUL_RID;
86 REAL_SUB_RZERO; REAL_SUB_LZERO; REAL_SUB_REFL;
87 REAL_ADD_LID; REAL_ADD_RID] THEN
88 AP_THM_TAC THEN AP_TERM_TAC THEN
89 REWRITE_TAC[REAL_POW_1] THEN
90 REWRITE_TAC[REAL_ARITH
91 `(a + b) * (x - y + z) - (a - b) * (x + y + z) =
92 &2 * (b * x + b * z - a * y)`] THEN
93 REWRITE_TAC[REAL_POW_2; REAL_MUL_RID] THEN
94 REWRITE_TAC[REAL_ARITH
95 `s * x * x + s - (&2 * x) * x * s = s * (&1 - x * x)`] THEN
96 REWRITE_TAC[real_div; REAL_INV_MUL; REAL_INV_INV; GSYM REAL_MUL_ASSOC] THEN
97 REWRITE_TAC[AC REAL_MUL_AC
98 `a * b * c * d * e * inv(a) * f =
99 (a * inv a) * b * c * d * e * f`] THEN
100 REWRITE_TAC[REAL_ARITH
101 `&1 + (x * s + &1) * (x * s + &1) =
102 &2 + &2 * x * s + (s * s) * x * x`] THEN
103 REWRITE_TAC[REAL_ARITH
104 `&1 + (x * s - &1) * (x * s - &1) =
105 &2 + &2 * x * --s + (s * s) * x * x`] THEN
106 SIMP_TAC[REWRITE_RULE[REAL_POW_2] SQRT_POW_2; REAL_POS] THEN
107 REWRITE_TAC[GSYM REAL_ADD_LDISTRIB] THEN
108 REWRITE_TAC[REAL_ARITH `&2 + &2 * x = &2 * (&1 + x)`] THEN
109 REWRITE_TAC[REAL_MUL_LNEG] THEN
110 REWRITE_TAC[REAL_ARITH
111 `&1 + x * (a + b) = (&1 + x * a) + x * b`] THEN
112 REWRITE_TAC[REAL_MUL_RNEG] THEN REWRITE_TAC[GSYM real_sub] THEN
113 REWRITE_TAC[REAL_ARITH `(&1 + x * a) + x * x = x * x + x * a + &1`] THEN
114 REWRITE_TAC[REAL_ARITH `(&1 - x * a) + x * x = x * x - x * a + &1`] THEN
115 REWRITE_TAC[REAL_INV_MUL; GSYM REAL_MUL_ASSOC] THEN
116 REWRITE_TAC[REAL_ARITH `inv(x) * y * z * x = (x * inv(x)) * y * z`] THEN
117 SIMP_TAC[REAL_MUL_RINV; REAL_OF_NUM_EQ; ARITH_EQ; REAL_MUL_LID] THEN
118 REWRITE_TAC[REAL_ARITH
119 `p' * n * &2 * s2 * aa * n' * n' =
120 (n' * n) * (p' * n') * &2 * s2 * aa`] THEN
121 MP_TAC(SPEC `x pow 2` REAL_LE_SQUARE) THEN
122 DISCH_THEN(MP_TAC o MATCH_MP (REAL_ARITH `&0 <= x ==> ~(&1 + x = &0)`)) THEN
123 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [GSYM REAL_POW_2] THEN
124 REWRITE_TAC[REAL_POW_POW; ARITH] THEN
125 REWRITE_TAC[GSYM FACTOR_1X4_LEMMA; REAL_ENTIRE; DE_MORGAN_THM] THEN
127 ASM_SIMP_TAC[REAL_MUL_LINV; REAL_MUL_LID] THEN
129 `!other. inv(x * x + x * sqrt (&2) + &1) * sqrt (&2) +
130 inv(x * x - x * sqrt (&2) + &1) * sqrt (&2) + other =
131 other + &2 * sqrt(&2) * (&1 + x * x) *
132 inv(x * x + x * sqrt (&2) + &1) *
133 inv(x * x - x * sqrt (&2) + &1)`
134 (fun th -> ONCE_REWRITE_TAC[th])
137 MATCH_MP_TAC REAL_EQ_LCANCEL_IMP THEN
138 EXISTS_TAC `(x * x + x * sqrt (&2) + &1) *
139 (x * x - x * sqrt (&2) + &1)` THEN
140 MATCH_MP_TAC(TAUT `~a /\ (~a ==> b) ==> ~a /\ b`) THEN CONJ_TAC THENL
141 [REWRITE_TAC[FACTOR_1X4_LEMMA] THEN
142 MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> ~(&1 + x = &0)`) THEN
143 SUBST1_TAC(SYM(NUM_REDUCE_CONV `2 + 2`)) THEN
144 REWRITE_TAC[REAL_POW_ADD; REAL_LE_SQUARE]; ALL_TAC] THEN
145 REWRITE_TAC[REAL_ENTIRE; DE_MORGAN_THM] THEN STRIP_TAC THEN
146 GEN_REWRITE_TAC LAND_CONV [REAL_ARITH
147 `(x * y) * (a + b + c) = (x * a) * y + (y * b) * x + x * y * c`] THEN
148 ASM_SIMP_TAC[REAL_MUL_ASSOC; REAL_MUL_RINV] THEN
149 REWRITE_TAC[REAL_ARITH
150 `(a + b + x * other = x * (other + c)) <=> (a + b = x * c)`] THEN
151 REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN
152 ONCE_REWRITE_TAC[AC REAL_MUL_AC
153 `p * n * x * y * z * p' * n' =
154 (p * p') * (n * n') * x * y * z`] THEN
155 ASM_SIMP_TAC[REAL_MUL_RINV; REAL_MUL_LID; REAL_MUL_RID] THEN
156 REWRITE_TAC[REAL_ARITH
157 `a * (x - y + z) + a * (x + y + z) = &2 * a * (x + z)`] THEN
158 REWRITE_TAC[REAL_ADD_AC]; ALL_TAC] THEN
159 REWRITE_TAC[GSYM REAL_INV_MUL; FACTOR_1X4_LEMMA] THEN
160 SUBGOAL_THEN `~(x + &1 = &0) /\ ~(x - &1 = &0)` STRIP_ASSUME_TAC THENL
162 [UNDISCH_TAC `&0 < (x + &1) pow 2`;
163 UNDISCH_TAC `&0 < (x - &1) pow 2`] THEN
164 DISCH_THEN(MP_TAC o MATCH_MP REAL_LT_IMP_NZ) THEN
165 SIMP_TAC[REAL_POW_EQ_0; ARITH_EQ]; ALL_TAC] THEN
166 ASM_SIMP_TAC[REAL_MUL_RINV; REAL_MUL_LID] THEN
167 REWRITE_TAC[REAL_ARITH
168 `i4 * &2 * s * (&1 - x2) + other + &2 * s * (&1 + x2) * i4 =
169 &4 * s * i4 + other`] THEN
170 MATCH_MP_TAC REAL_EQ_LCANCEL_IMP THEN EXISTS_TAC `&1 - x pow 8` THEN
171 MATCH_MP_TAC(TAUT `a /\ (a ==> b) ==> a /\ b`) THEN CONJ_TAC THENL
172 [MATCH_MP_TAC(REAL_ARITH `x < &1 ==> ~(&1 - x = &0)`) THEN
173 SUBST1_TAC(SYM(NUM_REDUCE_CONV `2 * 4`)) THEN
174 SUBST1_TAC(SYM(REAL_RAT_REDUCE_CONV `&1 pow 4`)) THEN
175 REWRITE_TAC[GSYM REAL_POW_POW] THEN MATCH_MP_TAC REAL_POW_LT2 THEN
176 REWRITE_TAC[ARITH_EQ; REAL_POW_2; REAL_LE_SQUARE] THEN
177 REWRITE_TAC[GSYM REAL_POW_2] THEN
178 ONCE_REWRITE_TAC[GSYM REAL_POW2_ABS] THEN
179 SUBST1_TAC(SYM(REAL_RAT_REDUCE_CONV `&1 pow 2`)) THEN
180 MATCH_MP_TAC REAL_POW_LT2 THEN
181 ASM_REWRITE_TAC[REAL_ABS_POS; ARITH_EQ]; ALL_TAC] THEN
182 SIMP_TAC[GSYM real_div; REAL_DIV_LMUL] THEN
183 SUBGOAL_THEN `!x. &1 - x pow 8 = (&1 + x pow 4) * (&1 - x pow 4)`
184 (fun th -> REWRITE_TAC[th])
186 [SUBST1_TAC(SYM(NUM_REDUCE_CONV `4 * 2`)) THEN
187 REWRITE_TAC[GSYM REAL_POW_POW] THEN
188 REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN
189 REWRITE_TAC[REAL_ENTIRE; DE_MORGAN_THM] THEN STRIP_TAC THEN
190 REWRITE_TAC[GSYM REAL_POW_2; GSYM(CONJUNCT2 real_pow)] THEN
191 CONV_TAC NUM_REDUCE_CONV THEN
192 SUBST1_TAC(SPECL [`x pow 4`; `&1`] REAL_ADD_SYM) THEN
193 REWRITE_TAC[real_div; REAL_ARITH
194 `a + b + c1 * c2 * x + x * d - x * e =
195 (a + b) + x * (c1 * c2 + d - e)`] THEN
196 ONCE_REWRITE_TAC[REAL_ARITH
197 `(p * m) * (x + inv(p) * y) = m * x * p + (p * inv(p)) * m * y`] THEN
198 ASM_SIMP_TAC[REAL_MUL_RINV; REAL_MUL_LID] THEN
199 UNDISCH_TAC `~(&1 - x pow 4 = &0)` THEN
200 SUBGOAL_THEN `!x. &1 - x pow 4 = (&1 + x pow 2) * (&1 - x pow 2)`
201 (fun th -> REWRITE_TAC[th])
203 [SUBST1_TAC(SYM(NUM_REDUCE_CONV `2 * 2`)) THEN
204 REWRITE_TAC[GSYM REAL_POW_POW] THEN
205 REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN
206 REWRITE_TAC[REAL_ENTIRE; DE_MORGAN_THM] THEN STRIP_TAC THEN
207 UNDISCH_TAC `~(&1 - x pow 2 = &0)` THEN
208 SUBGOAL_THEN `!x. &1 - x pow 2 = (&1 + x) * (&1 - x)`
209 (fun th -> REWRITE_TAC[th])
211 [REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN
212 REWRITE_TAC[REAL_ENTIRE; DE_MORGAN_THM] THEN STRIP_TAC THEN
213 ONCE_REWRITE_TAC[REAL_ARITH
214 `(x12 * (p1 + p2) * (m1 - m2)) * (m' * &2 + p' * &2) * other =
215 --(&2) * x12 * other *
216 ((p2 + p1) * (m2 - m1) * m' + (m2 - m1) * (p2 + p1) * p')`] THEN
217 ASM_SIMP_TAC[REAL_MUL_RINV] THEN
218 CONV_TAC(TOP_DEPTH_CONV num_CONV) THEN
219 REWRITE_TAC[real_pow] THEN CONV_TAC NUM_REDUCE_CONV THEN
222 let POLYLOG_CONVERGES = prove
223 (`!a b x. ~(a = 0) /\ ~(b = 0) /\ abs(x) < &1
224 ==> summable (\n. x pow (a * n + b) / &(a * n + b))`,
225 REPEAT STRIP_TAC THEN
226 MATCH_MP_TAC SER_COMPAR THEN
227 EXISTS_TAC `\n. abs(x) pow (a * n + b)` THEN CONJ_TAC THENL
228 [EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
229 REWRITE_TAC[REAL_ABS_DIV; GSYM REAL_ABS_POW; REAL_ABS_NUM] THEN
230 REWRITE_TAC[real_div] THEN
231 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN
232 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN
233 ASM_SIMP_TAC[REAL_INV_LE_1; REAL_OF_NUM_LE;
234 ARITH_RULE `~(b = 0) ==> 1 <= a + b`];
236 ONCE_REWRITE_TAC[ADD_SYM] THEN
237 REWRITE_TAC[REAL_POW_ADD; GSYM REAL_POW_POW] THEN
238 REWRITE_TAC[summable] THEN
239 EXISTS_TAC `abs(x) pow b * inv(&1 - abs(x) pow a)` THEN
240 MATCH_MP_TAC SER_CMUL THEN
242 REWRITE_TAC[REAL_ABS_POW; REAL_ABS_ABS] THEN
243 SUBST1_TAC(SYM(SPEC `a:num` REAL_POW_ONE)) THEN
244 MATCH_MP_TAC REAL_POW_LT2 THEN
245 ASM_REWRITE_TAC[REAL_ABS_POS]);;
247 let POLYLOG_DERIVATIVE = prove
248 (`!a b x. ~(a = 0) /\ ~(b = 0) /\ abs(x) < &1
249 ==> ((\x. suminf (\n. x pow (a * n + b) / &(a * n + b))) diffl
250 (x pow (b - 1) / (&1 - x pow a)))(x)`,
251 REPEAT STRIP_TAC THEN
252 SUBGOAL_THEN `abs(x pow a) < &1` ASSUME_TAC THENL
253 [REWRITE_TAC[REAL_ABS_POW] THEN
254 SUBST1_TAC(SYM(SPEC `a:num` REAL_POW_ONE)) THEN
255 MATCH_MP_TAC REAL_POW_LT2 THEN
256 ASM_REWRITE_TAC[REAL_ABS_POS]; ALL_TAC] THEN
257 MP_TAC(SPEC `x pow a` GP) THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN
259 `((\x. suminf (\n. inv(&(a * n + b)) * x pow n)) diffl
260 (suminf (\n. diffs (\n. inv(&(a * n + b))) n * (x pow a) pow n)))(x pow a)`
262 [MATCH_MP_TAC TERMDIFF_STRONG THEN
263 EXISTS_TAC `(abs(x pow a) + &1) / &2` THEN
264 ABBREV_TAC `k = (abs(x pow a) + &1) / &2` THEN
265 SUBGOAL_THEN `abs(x pow a) < abs(k) /\ abs(k) < &1` STRIP_ASSUME_TAC THENL
267 SIMP_TAC[REAL_ABS_DIV; REAL_ABS_NUM; REAL_LT_RDIV_EQ;
268 REAL_LT_LDIV_EQ; REAL_OF_NUM_LT; ARITH] THEN
269 UNDISCH_TAC `abs(x pow a) < &1` THEN REAL_ARITH_TAC; ALL_TAC] THEN
270 ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SER_COMPAR THEN
271 EXISTS_TAC `\n. abs(k) pow n` THEN CONJ_TAC THENL
272 [EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
273 REWRITE_TAC[] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
274 REWRITE_TAC[GSYM real_div; REAL_ABS_DIV;
275 GSYM REAL_ABS_POW; REAL_ABS_NUM] THEN
276 ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT;
277 ARITH_RULE `~(b = 0) ==> 0 < a + b`] THEN
278 GEN_REWRITE_TAC LAND_CONV [GSYM REAL_MUL_RID] THEN
279 MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN
280 ASM_SIMP_TAC[REAL_OF_NUM_LE;
281 ARITH_RULE `~(b = 0) ==> 1 <= a + b`]; ALL_TAC] THEN
282 REWRITE_TAC[summable] THEN EXISTS_TAC `inv(&1 - abs k)` THEN
283 ASM_SIMP_TAC[GP; REAL_ABS_ABS]; ALL_TAC] THEN
284 REWRITE_TAC[diffs] THEN
285 MP_TAC(SPECL [`a:num`; `x:real`] DIFF_POW) THEN
286 REWRITE_TAC[TAUT `a ==> b ==> c <=> b /\ a ==> c`] THEN
287 DISCH_THEN(MP_TAC o MATCH_MP DIFF_CHAIN) THEN
289 MP_TAC(SPECL [`b:num`; `x:real`] DIFF_POW) THEN
290 REWRITE_TAC[TAUT `a ==> b ==> c <=> b /\ a ==> c`] THEN
291 DISCH_THEN(MP_TAC o MATCH_MP DIFF_MUL) THEN
294 `summable (\n. &(SUC n) / &(a * SUC n + b) * (x pow a) pow (SUC n - 1))`
296 [REWRITE_TAC[SUC_SUB1] THEN MATCH_MP_TAC SER_COMPAR THEN
297 EXISTS_TAC `\n. abs(x pow a) pow n` THEN CONJ_TAC THENL
298 [EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
299 REWRITE_TAC[] THEN ONCE_REWRITE_TAC[REAL_ABS_MUL] THEN
300 REWRITE_TAC[GSYM REAL_ABS_POW] THEN
301 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
302 MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN
303 ASM_SIMP_TAC[REAL_OF_NUM_LE; REAL_OF_NUM_LT; REAL_ABS_DIV; REAL_ABS_NUM;
304 ARITH_RULE `~(b = 0) ==> 0 < a + b /\ 1 <= a + b`;
305 REAL_MUL_LID; REAL_LE_LDIV_EQ] THEN
306 MATCH_MP_TAC(ARITH_RULE `1 * n <= b ==> n <= b + c`) THEN
307 ASM_SIMP_TAC[LE_MULT_RCANCEL; ARITH_RULE `1 <= n <=> ~(n = 0)`];
309 REWRITE_TAC[summable] THEN EXISTS_TAC `inv(&1 - abs(x pow a))` THEN
310 ASM_SIMP_TAC[GP; REAL_ABS_ABS]; ALL_TAC] THEN
312 MATCH_MP(SPECL [`f:num->real`; `1`] SER_OFFSET_REV) o
313 REWRITE_RULE[ADD1]) THEN
314 REWRITE_TAC[SUM_1] THEN
315 REWRITE_TAC[real_div; REAL_MUL_LZERO; REAL_MUL_RZERO; REAL_ADD_LID] THEN
316 REWRITE_TAC[GSYM real_div] THEN
317 CONV_TAC(LAND_CONV(ONCE_DEPTH_CONV(ALPHA_CONV `n:num`))) THEN
318 REWRITE_TAC[ADD_SUB] THEN REWRITE_TAC[ADD1] THEN
319 DISCH_THEN(MP_TAC o MATCH_MP SER_CMUL) THEN
320 DISCH_THEN(MP_TAC o SPEC `&a * x pow (a - 1) * x pow b`) THEN
322 `summable (\n. inv(&(a * n + b)) * x pow a pow n)`
324 [MATCH_MP_TAC SER_COMPAR THEN
325 EXISTS_TAC `\n. abs(x pow a) pow n` THEN CONJ_TAC THENL
326 [EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
327 REWRITE_TAC[REAL_ABS_MUL; GSYM REAL_ABS_POW; REAL_ABS_NUM] THEN
328 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
329 MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN
330 REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN
331 ASM_SIMP_TAC[REAL_INV_LE_1; REAL_OF_NUM_LE;
332 ARITH_RULE `~(b = 0) ==> 1 <= a + b`];
334 REWRITE_TAC[summable] THEN
335 EXISTS_TAC `inv(&1 - abs(x pow a))` THEN
336 ASM_SIMP_TAC[GP; REAL_ABS_ABS]; ALL_TAC] THEN
337 DISCH_THEN(fun th -> ASSUME_TAC th THEN MP_TAC th) THEN
338 DISCH_THEN(MP_TAC o MATCH_MP SUMMABLE_SUM) THEN
339 DISCH_THEN(MP_TAC o MATCH_MP SER_CMUL) THEN
340 DISCH_THEN(MP_TAC o SPEC `&b * x pow (b - 1)`) THEN
341 ONCE_REWRITE_TAC[TAUT `a ==> b ==> c <=> b /\ a ==> c`] THEN
342 DISCH_THEN(MP_TAC o MATCH_MP SER_ADD) THEN REWRITE_TAC[] THEN
344 `!n. (&a * x pow (a - 1) * x pow b) *
345 &n / &(a * n + b) * x pow a pow (n - 1) +
346 (&b * x pow (b - 1)) * inv(&(a * n + b)) * x pow a pow n =
347 x pow (a * n + b - 1)`
348 (fun th -> REWRITE_TAC[th])
350 [X_GEN_TAC `n:num` THEN ASM_CASES_TAC `n = 0` THENL
351 [ASM_REWRITE_TAC[SUB_0; real_pow; MULT_CLAUSES; ADD_CLAUSES] THEN
352 REWRITE_TAC[real_div; REAL_MUL_LZERO; REAL_MUL_RZERO] THEN
353 REWRITE_TAC[REAL_ADD_LID; GSYM REAL_MUL_ASSOC; REAL_MUL_RID] THEN
354 ASM_SIMP_TAC[GSYM real_div; REAL_DIV_LMUL; REAL_OF_NUM_EQ]; ALL_TAC] THEN
355 REWRITE_TAC[REAL_POW_ADD; GSYM REAL_POW_POW] THEN
356 SUBGOAL_THEN `(x pow a) pow n = x pow a * (x pow a) pow (n - 1)`
358 [REWRITE_TAC[GSYM(CONJUNCT2 real_pow)] THEN
359 AP_TERM_TAC THEN UNDISCH_TAC `~(n = 0)` THEN ARITH_TAC; ALL_TAC] THEN
360 REWRITE_TAC[REAL_POW_POW] THEN
361 SUBGOAL_THEN `x pow a = x * x pow (a - 1)` SUBST1_TAC THENL
362 [REWRITE_TAC[GSYM(CONJUNCT2 real_pow)] THEN
363 AP_TERM_TAC THEN UNDISCH_TAC `~(a = 0)` THEN ARITH_TAC; ALL_TAC] THEN
364 SUBGOAL_THEN `x pow b = x * x pow (b - 1)` SUBST1_TAC THENL
365 [REWRITE_TAC[GSYM(CONJUNCT2 real_pow)] THEN
366 AP_TERM_TAC THEN UNDISCH_TAC `~(b = 0)` THEN ARITH_TAC; ALL_TAC] THEN
367 REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN
368 REWRITE_TAC[REAL_ARITH
369 `a * xa1 * x * xb1 * n * i * xan1 + b * xb1 * i * x * xa1 * xan1 =
370 x * xa1 * xan1 * xb1 * (a * n + b) * i`] THEN
371 ASM_SIMP_TAC[GSYM real_div; REAL_OF_NUM_MUL; REAL_OF_NUM_ADD] THEN
372 ASM_SIMP_TAC[REAL_DIV_REFL; REAL_MUL_RID; REAL_OF_NUM_EQ;
373 ARITH_RULE `~(b = 0) ==> ~(a + b = 0)`];
375 DISCH_THEN(MP_TAC o MATCH_MP SUM_UNIQ) THEN
377 `x pow (b - 1) / (&1 - x pow a) = suminf (\n. x pow (a * n + b - 1))`
378 (SUBST1_TAC o SYM) THENL
379 [MATCH_MP_TAC SUM_UNIQ THEN
380 ONCE_REWRITE_TAC[ADD_SYM] THEN
381 REWRITE_TAC[REAL_POW_ADD; real_div] THEN
382 MATCH_MP_TAC SER_CMUL THEN
383 ASM_SIMP_TAC[GSYM REAL_POW_POW; GP]; ALL_TAC] THEN
384 SIMP_TAC[REAL_MUL_AC] THEN DISCH_THEN(K ALL_TAC) THEN
385 REWRITE_TAC[diffl] THEN
386 MATCH_MP_TAC(ONCE_REWRITE_RULE[IMP_CONJ]
388 REWRITE_TAC[LIM] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
389 EXISTS_TAC `&1 - abs(x)` THEN
390 ASM_REWRITE_TAC[REAL_SUB_LT; REAL_SUB_RZERO] THEN
391 X_GEN_TAC `h:real` THEN STRIP_TAC THEN
392 MATCH_MP_TAC(REAL_ARITH `(a = a') /\ &0 < b ==> abs(a - a') < b`) THEN
393 ASM_REWRITE_TAC[] THEN
394 AP_THM_TAC THEN AP_TERM_TAC THEN
395 SUBGOAL_THEN `abs(x + h) < &1` ASSUME_TAC THENL
396 [UNDISCH_TAC `abs(h) < &1 - abs(x)` THEN REAL_ARITH_TAC; ALL_TAC] THEN
399 ==> (suminf (\n. z pow (a * n + b) / &(a * n + b)) =
400 z pow b * suminf (\n. inv (&(a * n + b)) * z pow a pow n))`
401 (fun th -> ASM_SIMP_TAC[th]) THEN
402 X_GEN_TAC `z:real` THEN DISCH_TAC THEN
403 MATCH_MP_TAC(GSYM SUM_UNIQ) THEN
404 ONCE_REWRITE_TAC[ADD_SYM] THEN
405 REWRITE_TAC[REAL_POW_ADD; real_div; GSYM REAL_MUL_ASSOC] THEN
406 MATCH_MP_TAC SER_CMUL THEN
407 GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [REAL_MUL_SYM] THEN
408 REWRITE_TAC[GSYM REAL_POW_POW] THEN
409 MATCH_MP_TAC SUMMABLE_SUM THEN
410 ONCE_REWRITE_TAC[ADD_SYM] THEN
411 MATCH_MP_TAC SER_COMPAR THEN
412 EXISTS_TAC `\n. abs(z pow a) pow n` THEN CONJ_TAC THENL
413 [EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
414 REWRITE_TAC[REAL_ABS_MUL; GSYM REAL_ABS_POW; REAL_ABS_NUM] THEN
415 GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN
416 MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN
417 REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN
418 ASM_SIMP_TAC[REAL_INV_LE_1; REAL_OF_NUM_LE;
419 ARITH_RULE `~(b = 0) ==> 1 <= a + b`];
421 REWRITE_TAC[summable] THEN
422 EXISTS_TAC `inv(&1 - abs(z pow a))` THEN
423 MATCH_MP_TAC GP THEN REWRITE_TAC[REAL_ABS_ABS; REAL_ABS_POW] THEN
424 SUBST1_TAC(SYM(SPEC `a:num` REAL_POW_ONE)) THEN
425 MATCH_MP_TAC REAL_POW_LT2 THEN ASM_REWRITE_TAC[REAL_ABS_POS]);;
427 let POLYLOG_THM = prove
428 (`(\n. inv(&16 pow n) * (&4 / &(8 * n + 1) -
435 ==> ((\x. suminf (\n. &4 * sqrt(&2) * x pow (8 * n + 1) / &(8 * n + 1) -
436 &8 * x pow (8 * n + 4) / &(8 * n + 4) -
437 &4 * sqrt(&2) * x pow (8 * n + 5) / &(8 * n + 5) -
438 &8 * x pow (8 * n + 6) / &(8 * n + 6)))
442 &4 * sqrt(&2) * x pow 4 -
443 &8 * x pow 5) / (&1 - x pow 8))(x)`
445 [REPEAT STRIP_TAC THEN
446 MP_TAC(SPECL [`8`; `1`; `x:real`] POLYLOG_DERIVATIVE) THEN
447 CONV_TAC NUM_REDUCE_CONV THEN ASM_REWRITE_TAC[real_pow] THEN
448 DISCH_THEN(MP_TAC o SPEC `&4 * sqrt(&2)` o MATCH_MP DIFF_CMUL) THEN
449 MP_TAC(SPECL [`8`; `4`; `x:real`] POLYLOG_DERIVATIVE) THEN
450 CONV_TAC NUM_REDUCE_CONV THEN ASM_REWRITE_TAC[] THEN
451 DISCH_THEN(MP_TAC o SPEC `&8` o MATCH_MP DIFF_CMUL) THEN
452 MP_TAC(SPECL [`8`; `5`; `x:real`] POLYLOG_DERIVATIVE) THEN
453 CONV_TAC NUM_REDUCE_CONV THEN ASM_REWRITE_TAC[] THEN
454 DISCH_THEN(MP_TAC o SPEC `&4 * sqrt(&2)` o MATCH_MP DIFF_CMUL) THEN
455 MP_TAC(SPECL [`8`; `6`; `x:real`] POLYLOG_DERIVATIVE) THEN
456 CONV_TAC NUM_REDUCE_CONV THEN ASM_REWRITE_TAC[] THEN
457 DISCH_THEN(MP_TAC o SPEC `&8` o MATCH_MP DIFF_CMUL) THEN
459 ONCE_REWRITE_TAC[TAUT `a ==> b ==> c <=> b /\ a ==> c`] THEN
460 DISCH_THEN(MP_TAC o MATCH_MP DIFF_ADD) THEN
461 ONCE_REWRITE_TAC[TAUT `a ==> b ==> c <=> b /\ a ==> c`] THEN
462 DISCH_THEN(MP_TAC o MATCH_MP DIFF_ADD) THEN
463 ONCE_REWRITE_TAC[TAUT `a ==> b ==> c <=> b /\ a ==> c`] THEN
464 DISCH_THEN(MP_TAC o MATCH_MP DIFF_SUB) THEN
465 REWRITE_TAC[real_div; REAL_MUL_ASSOC; GSYM REAL_ADD_RDISTRIB;
466 GSYM REAL_SUB_RDISTRIB] THEN
467 REWRITE_TAC[REAL_ARITH `a - (b + c + d) = a - b - c - d`] THEN
468 REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN REWRITE_TAC[GSYM real_div] THEN
469 REWRITE_TAC[REAL_MUL_ASSOC; REAL_MUL_RID] THEN
470 REWRITE_TAC[diffl] THEN
471 MATCH_MP_TAC(ONCE_REWRITE_RULE[IMP_CONJ]
473 REWRITE_TAC[LIM] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN
474 EXISTS_TAC `&1 - abs(x)` THEN
475 ASM_REWRITE_TAC[REAL_SUB_LT; REAL_SUB_RZERO] THEN
476 X_GEN_TAC `h:real` THEN STRIP_TAC THEN
477 MATCH_MP_TAC(REAL_ARITH `(a = a') /\ &0 < b ==> abs(a - a') < b`) THEN
478 ASM_REWRITE_TAC[] THEN
479 AP_THM_TAC THEN AP_TERM_TAC THEN
480 SUBGOAL_THEN `abs(x + h) < &1` ASSUME_TAC THENL
481 [UNDISCH_TAC `abs(h) < &1 - abs(x)` THEN REAL_ARITH_TAC; ALL_TAC] THEN
485 (\n. (&4 * sqrt (&2)) * z pow (8 * n + 1) / &(8 * n + 1) -
486 &8 * z pow (8 * n + 4) / &(8 * n + 4) -
487 (&4 * sqrt (&2)) * z pow (8 * n + 5) / &(8 * n + 5) -
488 &8 * z pow (8 * n + 6) / &(8 * n + 6)) =
489 (&4 * sqrt (&2)) * suminf (\n. z pow (8 * n + 1) / &(8 * n + 1)) -
490 &8 * suminf (\n. z pow (8 * n + 4) / &(8 * n + 4)) -
491 (&4 * sqrt (&2)) * suminf (\n. z pow (8 * n + 5) / &(8 * n + 5)) -
492 &8 * suminf (\n. z pow (8 * n + 6) / &(8 * n + 6)))`
493 (fun th -> ASM_SIMP_TAC[th]) THEN
494 X_GEN_TAC `z:real` THEN DISCH_TAC THEN
495 MATCH_MP_TAC(GSYM SUM_UNIQ) THEN
496 REPEAT(MATCH_MP_TAC SER_SUB THEN CONJ_TAC) THEN
497 MATCH_MP_TAC SER_CMUL THEN
498 MATCH_MP_TAC SUMMABLE_SUM THEN
499 MATCH_MP_TAC POLYLOG_CONVERGES THEN
500 ASM_REWRITE_TAC[] THEN CONV_TAC NUM_REDUCE_CONV; ALL_TAC] THEN
502 `\x. suminf (\n. &4 * sqrt (&2) * x pow (8 * n + 1) / &(8 * n + 1) -
503 &8 * x pow (8 * n + 4) / &(8 * n + 4) -
504 &4 * sqrt (&2) * x pow (8 * n + 5) / &(8 * n + 5) -
505 &8 * x pow (8 * n + 6) / &(8 * n + 6)) -
506 (ln ((x - &1) pow 2) +
508 ln((x pow 2 + x * sqrt (&2) + &1) /
509 (x pow 2 - x * sqrt (&2) + &1)) +
510 &2 * atn (x * sqrt (&2) + &1) +
511 &2 * atn (x * sqrt (&2) - &1) +
512 &2 * atn (x pow 2) - ln (x pow 4 + &1))` DIFF_ISCONST_END_SIMPLE) THEN
513 DISCH_THEN(MP_TAC o SPECL [`&0`; `inv(sqrt(&2))`]) THEN
514 W(C SUBGOAL_THEN (fun th -> REWRITE_TAC[th]) o funpow 2 lhand o snd) THENL
515 [SIMP_TAC[SQRT_POS_LT; REAL_LT_INV_EQ; REAL_OF_NUM_LT; ARITH] THEN
516 X_GEN_TAC `x:real` THEN STRIP_TAC THEN
517 SUBGOAL_THEN `abs(x) < &1` MP_TAC THENL
518 [MATCH_MP_TAC(REAL_ARITH
519 `!a. &0 <= x /\ x <= a /\ a < &1 ==> abs(x) < &1`) THEN
520 EXISTS_TAC `inv(sqrt(&2))` THEN ASM_REWRITE_TAC[] THEN
521 SUBST1_TAC(SYM(REAL_RAT_REDUCE_CONV `inv(&1)`)) THEN
522 MATCH_MP_TAC REAL_LT_INV2 THEN REWRITE_TAC[REAL_LT_01] THEN
523 MATCH_MP_TAC REAL_LTE_TRANS THEN
524 EXISTS_TAC `sqrt((&5 / &4) pow 2)` THEN CONJ_TAC THENL
525 [SIMP_TAC[POW_2_SQRT; REAL_LE_DIV; REAL_POS] THEN
526 CONV_TAC REAL_RAT_REDUCE_CONV; ALL_TAC] THEN
527 MATCH_MP_TAC SQRT_MONO_LE THEN CONV_TAC REAL_RAT_REDUCE_CONV;
529 DISCH_THEN(fun th -> MP_TAC(MATCH_MP MAGIC_DERIVATIVE th) THEN
530 ANTE_RES_THEN MP_TAC th) THEN
531 ONCE_REWRITE_TAC[IMP_IMP] THEN
532 DISCH_THEN(MP_TAC o MATCH_MP DIFF_SUB) THEN
533 REWRITE_TAC[REAL_SUB_REFL]; ALL_TAC] THEN
534 SIMP_TAC[snd(EQ_IMP_RULE(SPEC_ALL REAL_POW_EQ_0));
535 ARITH_RULE `~(b = 0) ==> ~(a + b = 0)`;
537 REWRITE_TAC[real_div; REAL_MUL_LZERO; REAL_MUL_RZERO] THEN
538 REWRITE_TAC[GSYM real_div; REAL_ADD_LID; REAL_ADD_RID] THEN
539 CONV_TAC REAL_RAT_REDUCE_CONV THEN
540 REWRITE_TAC[REAL_DIV_1; LN_1; ATN_1; ATN_NEG; ATN_0] THEN
541 REWRITE_TAC[REAL_ARITH `a * b + a * --b + c = c`] THEN
542 SUBGOAL_THEN `suminf (\n. &0) = &0` SUBST1_TAC THENL
543 [MATCH_MP_TAC(GSYM SUM_UNIQ) THEN
544 MP_TAC(SPECL [`\n:num. &0`; `0`] SER_0) THEN REWRITE_TAC[sum];
546 REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_LID; REAL_SUB_REFL] THEN
547 SIMP_TAC[REAL_MUL_LINV; REAL_LT_IMP_NZ; REAL_LT_INV_EQ;
548 SQRT_POS_LT; REAL_OF_NUM_LT; ARITH_LE; ARITH_LT] THEN
549 SUBGOAL_THEN `inv(sqrt(&2)) pow 4 = inv(sqrt(&2)) pow 2 pow 2`
550 SUBST1_TAC THENL [REWRITE_TAC[REAL_POW_POW; ARITH]; ALL_TAC] THEN
551 SUBGOAL_THEN `inv(sqrt(&2)) pow 2 = &1 / &2` SUBST1_TAC THENL
552 [REWRITE_TAC[REAL_POW_INV; real_div; REAL_MUL_LID] THEN AP_TERM_TAC THEN
553 SIMP_TAC[SQRT_POW_2; REAL_POS]; ALL_TAC] THEN
554 CONV_TAC REAL_RAT_REDUCE_CONV THEN
556 `!other. ln((inv (sqrt (&2)) - &1) pow 2) +
557 ln((inv (sqrt (&2)) + &1) pow 2) + other =
559 (fun th -> ONCE_REWRITE_TAC[th])
561 [GEN_TAC THEN REWRITE_TAC[REAL_ADD_ASSOC] THEN
562 AP_THM_TAC THEN AP_TERM_TAC THEN
563 SUBGOAL_THEN `&0 < (inv(sqrt(&2)) - &1) pow 2 /\
564 &0 < (inv(sqrt (&2)) + &1) pow 2`
565 (fun th -> SIMP_TAC[GSYM LN_MUL; th])
567 [REWRITE_TAC[REAL_ARITH `&0 < x <=> &0 <= x /\ ~(x = &0)`] THEN
568 REWRITE_TAC[REAL_POW_2; REAL_LE_SQUARE; REAL_ENTIRE] THEN
569 MATCH_MP_TAC(REAL_ARITH
570 `&0 < x /\ x < &1 ==> ~(x - &1 = &0) /\ ~(x + &1 = &0)`) THEN
571 SIMP_TAC[REAL_LT_INV_EQ; SQRT_POS_LT; REAL_OF_NUM_LT; ARITH] THEN
572 MATCH_MP_TAC REAL_LET_TRANS THEN
573 EXISTS_TAC `sqrt((&4 / &5) pow 2)` THEN CONJ_TAC THENL
575 SIMP_TAC[POW_2_SQRT; REAL_LE_DIV; REAL_POS] THEN
576 CONV_TAC REAL_RAT_REDUCE_CONV] THEN
577 SIMP_TAC[GSYM SQRT_INV; REAL_POS] THEN
578 MATCH_MP_TAC SQRT_MONO_LE THEN CONV_TAC REAL_RAT_REDUCE_CONV;
580 REWRITE_TAC[GSYM REAL_POW_MUL] THEN
581 REWRITE_TAC[REAL_ARITH `(x - &1) * (x + &1) = x * x - &1`] THEN
582 REWRITE_TAC[GSYM REAL_POW_2] THEN
583 SUBGOAL_THEN `inv(sqrt(&2)) pow 2 = &1 / &2` SUBST1_TAC THENL
584 [REWRITE_TAC[REAL_POW_INV; real_div; REAL_MUL_LID] THEN AP_TERM_TAC THEN
585 SIMP_TAC[SQRT_POW_2; REAL_POS]; ALL_TAC] THEN
586 CONV_TAC REAL_RAT_REDUCE_CONV; ALL_TAC] THEN
587 REWRITE_TAC[ATN_0; REAL_MUL_RZERO; REAL_ADD_LID] THEN
588 ONCE_REWRITE_TAC[REAL_ARITH
589 `l1 + l2 + a + y - l3 = (l1 + l2 - l3) + a + y`] THEN
590 SIMP_TAC[GSYM LN_DIV; GSYM LN_MUL; REAL_LT_DIV; REAL_LT_MUL; REAL_OF_NUM_LT;
591 ARITH_LE; ARITH_LT] THEN
592 CONV_TAC REAL_RAT_REDUCE_CONV THEN REWRITE_TAC[LN_1; REAL_ADD_LID] THEN
593 REWRITE_TAC[GSYM REAL_ADD_LDISTRIB] THEN
594 ONCE_REWRITE_TAC[ADD_SYM] THEN
595 REWRITE_TAC[REAL_POW_ADD; real_div; REAL_MUL_ASSOC] THEN
596 SUBGOAL_THEN `!n. inv(sqrt (&2)) pow (8 * n) = inv(&16 pow n)`
597 (fun th -> REWRITE_TAC[th])
599 [SUBST1_TAC(SYM(NUM_REDUCE_CONV `2 * 4`)) THEN
600 REWRITE_TAC[GSYM REAL_POW_POW] THEN
601 SUBGOAL_THEN `inv(sqrt(&2)) pow 2 = &1 / &2` SUBST1_TAC THENL
602 [REWRITE_TAC[REAL_POW_INV; real_div; REAL_MUL_LID] THEN AP_TERM_TAC THEN
603 SIMP_TAC[SQRT_POW_2; REAL_POS]; ALL_TAC] THEN
604 CONV_TAC REAL_RAT_REDUCE_CONV THEN
605 REWRITE_TAC[GSYM REAL_POW_INV] THEN
606 REWRITE_TAC[real_div; REAL_MUL_LID]; ALL_TAC] THEN
607 REWRITE_TAC[GSYM REAL_MUL_ASSOC; GSYM REAL_INV_MUL] THEN
608 SUBGOAL_THEN `!x. x pow 5 = x * x pow 4` (fun th -> REWRITE_TAC[th]) THENL
609 [REWRITE_TAC[GSYM(CONJUNCT2 real_pow); ARITH]; ALL_TAC] THEN
610 REWRITE_TAC[REAL_POW_1] THEN
611 ONCE_REWRITE_TAC[REAL_ARITH
612 `a * s * i * b - c - d * s * (i * e) * f - g =
613 (s * i) * a * b - c - (s * i) * d * e * f - g`] THEN
614 SIMP_TAC[REAL_MUL_RINV; REAL_LT_IMP_NZ; SQRT_POS_LT; REAL_OF_NUM_LT;
615 ARITH_LT; ARITH_LE] THEN
616 SUBGOAL_THEN `!x. x pow 6 = (x pow 2) pow 3`
617 (fun th -> REWRITE_TAC[th])
618 THENL [REWRITE_TAC[REAL_POW_POW; ARITH]; ALL_TAC] THEN
619 SUBGOAL_THEN `!x. x pow 4 = (x pow 2) pow 2`
620 (fun th -> REWRITE_TAC[th])
621 THENL [REWRITE_TAC[REAL_POW_POW; ARITH]; ALL_TAC] THEN
622 SUBGOAL_THEN `inv(sqrt(&2)) pow 2 = &1 / &2` SUBST1_TAC THENL
623 [REWRITE_TAC[REAL_POW_INV; real_div; REAL_MUL_LID] THEN AP_TERM_TAC THEN
624 SIMP_TAC[SQRT_POW_2; REAL_POS]; ALL_TAC] THEN
625 REWRITE_TAC[REAL_MUL_ASSOC] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
626 ONCE_REWRITE_TAC[ADD_SYM] THEN
627 REWRITE_TAC[REAL_INV_MUL] THEN
628 ONCE_REWRITE_TAC[AC REAL_MUL_AC `a * b * c = b * a * c`] THEN
629 REWRITE_TAC[GSYM REAL_SUB_LDISTRIB] THEN
630 REWRITE_TAC[GSYM real_div] THEN
631 REWRITE_TAC[REAL_SUB_0] THEN DISCH_TAC THEN
634 (\n. inv (&16 pow n) *
640 [MATCH_MP_TAC SER_COMPAR THEN
641 EXISTS_TAC `\n. &8 / &16 pow n` THEN CONJ_TAC THENL
642 [EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN
643 REWRITE_TAC[REAL_ABS_MUL; GSYM REAL_ABS_POW; REAL_ABS_NUM] THEN
644 GEN_REWRITE_TAC LAND_CONV [REAL_MUL_SYM] THEN
645 REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_MUL2 THEN
646 REWRITE_TAC[REAL_ABS_POS] THEN
647 REWRITE_TAC[REAL_ABS_INV; REAL_ABS_POW; REAL_ABS_NUM; REAL_LE_REFL] THEN
648 MATCH_MP_TAC(REAL_ARITH
649 `abs(v) <= &1 /\ abs(w) <= &1 /\ abs(x) <= &1 /\ abs(y) <= &1
650 ==> abs(&4 * v - &2 * w - &1 * x - &1 * y) <= &8`) THEN
651 REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN
652 SUBST1_TAC(SYM REAL_INV_1) THEN
653 REPEAT CONJ_TAC THEN MATCH_MP_TAC REAL_LE_INV2 THEN
654 CONV_TAC REAL_RAT_REDUCE_CONV THEN
655 REWRITE_TAC[REAL_OF_NUM_LE] THEN ARITH_TAC; ALL_TAC] THEN
656 REWRITE_TAC[summable] THEN EXISTS_TAC `&8 / (&1 - inv(&16))` THEN
657 REWRITE_TAC[real_div; GSYM REAL_POW_INV] THEN
658 MATCH_MP_TAC SER_CMUL THEN
659 MATCH_MP_TAC GP THEN CONV_TAC REAL_RAT_REDUCE_CONV; ALL_TAC] THEN
660 DISCH_THEN(MP_TAC o MATCH_MP SUMMABLE_SUM) THEN ASM_REWRITE_TAC[] THEN
661 MATCH_MP_TAC EQ_IMP THEN
662 REWRITE_TAC[real_div; REAL_MUL_LID] THEN AP_TERM_TAC THEN
663 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
664 SIMP_TAC[GSYM REAL_EQ_RDIV_EQ; REAL_OF_NUM_LT; ARITH] THEN
665 MP_TAC(SPEC `atn(&1 / &2)` TAN_COT) THEN
666 REWRITE_TAC[ATN_TAN] THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN
667 DISCH_THEN(MP_TAC o AP_TERM `atn`) THEN REWRITE_TAC[REAL_DIV_1] THEN
668 MATCH_MP_TAC(REAL_ARITH
669 `(a = d - c) ==> (a = b) ==> (b + c = d)`) THEN
670 MATCH_MP_TAC TAN_ATN THEN REWRITE_TAC[PI2_PI4] THEN
671 MATCH_MP_TAC(REAL_ARITH
673 ==> --(&2 * p4) < &2 * p4 - x /\ &2 * p4 - x < &2 * p4`) THEN
675 [SUBST1_TAC(SYM ATN_0) THEN MATCH_MP_TAC ATN_MONO_LT THEN
676 CONV_TAC REAL_RAT_REDUCE_CONV;
677 MATCH_MP_TAC ATN_LT_PI4_POS THEN CONV_TAC REAL_RAT_REDUCE_CONV]);;