216 |
216 |
217 private lemma condensation_inequality: |
217 private lemma condensation_inequality: |
218 assumes mono: "\<And>m n. 0 < m \<Longrightarrow> m \<le> n \<Longrightarrow> f n \<le> f m" |
218 assumes mono: "\<And>m n. 0 < m \<Longrightarrow> m \<le> n \<Longrightarrow> f n \<le> f m" |
219 shows "(\<Sum>k=1..<n. f k) \<ge> (\<Sum>k=1..<n. f (2 * 2 ^ natlog2 k))" (is "?thesis1") |
219 shows "(\<Sum>k=1..<n. f k) \<ge> (\<Sum>k=1..<n. f (2 * 2 ^ natlog2 k))" (is "?thesis1") |
220 "(\<Sum>k=1..<n. f k) \<le> (\<Sum>k=1..<n. f (2 ^ natlog2 k))" (is "?thesis2") |
220 "(\<Sum>k=1..<n. f k) \<le> (\<Sum>k=1..<n. f (2 ^ natlog2 k))" (is "?thesis2") |
221 by (intro setsum_mono mono pow_natlog2_ge pow_natlog2_le, simp, simp)+ |
221 by (intro sum_mono mono pow_natlog2_ge pow_natlog2_le, simp, simp)+ |
222 |
222 |
223 private lemma condensation_condense1: "(\<Sum>k=1..<2^n. f (2 ^ natlog2 k)) = (\<Sum>k<n. 2^k * f (2 ^ k))" |
223 private lemma condensation_condense1: "(\<Sum>k=1..<2^n. f (2 ^ natlog2 k)) = (\<Sum>k<n. 2^k * f (2 ^ k))" |
224 proof (induction n) |
224 proof (induction n) |
225 case (Suc n) |
225 case (Suc n) |
226 have "{1..<2^Suc n} = {1..<2^n} \<union> {2^n..<(2^Suc n :: nat)}" by auto |
226 have "{1..<2^Suc n} = {1..<2^n} \<union> {2^n..<(2^Suc n :: nat)}" by auto |
227 also have "(\<Sum>k\<in>\<dots>. f (2 ^ natlog2 k)) = |
227 also have "(\<Sum>k\<in>\<dots>. f (2 ^ natlog2 k)) = |
228 (\<Sum>k<n. 2^k * f (2^k)) + (\<Sum>k = 2^n..<2^Suc n. f (2^natlog2 k))" |
228 (\<Sum>k<n. 2^k * f (2^k)) + (\<Sum>k = 2^n..<2^Suc n. f (2^natlog2 k))" |
229 by (subst setsum.union_disjoint) (insert Suc, auto) |
229 by (subst sum.union_disjoint) (insert Suc, auto) |
230 also have "natlog2 k = n" if "k \<in> {2^n..<2^Suc n}" for k using that by (intro natlog2_eqI) simp_all |
230 also have "natlog2 k = n" if "k \<in> {2^n..<2^Suc n}" for k using that by (intro natlog2_eqI) simp_all |
231 hence "(\<Sum>k = 2^n..<2^Suc n. f (2^natlog2 k)) = (\<Sum>(_::nat) = 2^n..<2^Suc n. f (2^n))" |
231 hence "(\<Sum>k = 2^n..<2^Suc n. f (2^natlog2 k)) = (\<Sum>(_::nat) = 2^n..<2^Suc n. f (2^n))" |
232 by (intro setsum.cong) simp_all |
232 by (intro sum.cong) simp_all |
233 also have "\<dots> = 2^n * f (2^n)" by (simp add: of_nat_power) |
233 also have "\<dots> = 2^n * f (2^n)" by (simp add: of_nat_power) |
234 finally show ?case by simp |
234 finally show ?case by simp |
235 qed simp |
235 qed simp |
236 |
236 |
237 private lemma condensation_condense2: "(\<Sum>k=1..<2^n. f (2 * 2 ^ natlog2 k)) = (\<Sum>k<n. 2^k * f (2 ^ Suc k))" |
237 private lemma condensation_condense2: "(\<Sum>k=1..<2^n. f (2 * 2 ^ natlog2 k)) = (\<Sum>k<n. 2^k * f (2 ^ Suc k))" |
238 proof (induction n) |
238 proof (induction n) |
239 case (Suc n) |
239 case (Suc n) |
240 have "{1..<2^Suc n} = {1..<2^n} \<union> {2^n..<(2^Suc n :: nat)}" by auto |
240 have "{1..<2^Suc n} = {1..<2^n} \<union> {2^n..<(2^Suc n :: nat)}" by auto |
241 also have "(\<Sum>k\<in>\<dots>. f (2 * 2 ^ natlog2 k)) = |
241 also have "(\<Sum>k\<in>\<dots>. f (2 * 2 ^ natlog2 k)) = |
242 (\<Sum>k<n. 2^k * f (2^Suc k)) + (\<Sum>k = 2^n..<2^Suc n. f (2 * 2^natlog2 k))" |
242 (\<Sum>k<n. 2^k * f (2^Suc k)) + (\<Sum>k = 2^n..<2^Suc n. f (2 * 2^natlog2 k))" |
243 by (subst setsum.union_disjoint) (insert Suc, auto) |
243 by (subst sum.union_disjoint) (insert Suc, auto) |
244 also have "natlog2 k = n" if "k \<in> {2^n..<2^Suc n}" for k using that by (intro natlog2_eqI) simp_all |
244 also have "natlog2 k = n" if "k \<in> {2^n..<2^Suc n}" for k using that by (intro natlog2_eqI) simp_all |
245 hence "(\<Sum>k = 2^n..<2^Suc n. f (2*2^natlog2 k)) = (\<Sum>(_::nat) = 2^n..<2^Suc n. f (2^Suc n))" |
245 hence "(\<Sum>k = 2^n..<2^Suc n. f (2*2^natlog2 k)) = (\<Sum>(_::nat) = 2^n..<2^Suc n. f (2^Suc n))" |
246 by (intro setsum.cong) simp_all |
246 by (intro sum.cong) simp_all |
247 also have "\<dots> = 2^n * f (2^Suc n)" by (simp add: of_nat_power) |
247 also have "\<dots> = 2^n * f (2^Suc n)" by (simp add: of_nat_power) |
248 finally show ?case by simp |
248 finally show ?case by simp |
249 qed simp |
249 qed simp |
250 |
250 |
251 lemma condensation_test: |
251 lemma condensation_test: |
265 also have "monoseq (\<lambda>n. \<Sum>k<n. f' k)" unfolding f'_def |
265 also have "monoseq (\<lambda>n. \<Sum>k<n. f' k)" unfolding f'_def |
266 by (intro mono_SucI1) (auto intro!: mult_nonneg_nonneg nonneg) |
266 by (intro mono_SucI1) (auto intro!: mult_nonneg_nonneg nonneg) |
267 hence "convergent (\<lambda>n. \<Sum>k<n. f' k) \<longleftrightarrow> Bseq (\<lambda>n. \<Sum>k<n. f' k)" |
267 hence "convergent (\<lambda>n. \<Sum>k<n. f' k) \<longleftrightarrow> Bseq (\<lambda>n. \<Sum>k<n. f' k)" |
268 by (rule monoseq_imp_convergent_iff_Bseq) |
268 by (rule monoseq_imp_convergent_iff_Bseq) |
269 also have "\<dots> \<longleftrightarrow> Bseq (\<lambda>n. \<Sum>k=1..<n. f' k)" unfolding One_nat_def |
269 also have "\<dots> \<longleftrightarrow> Bseq (\<lambda>n. \<Sum>k=1..<n. f' k)" unfolding One_nat_def |
270 by (subst setsum_shift_lb_Suc0_0_upt) (simp_all add: f'_def atLeast0LessThan) |
270 by (subst sum_shift_lb_Suc0_0_upt) (simp_all add: f'_def atLeast0LessThan) |
271 also have "\<dots> \<longleftrightarrow> Bseq (\<lambda>n. \<Sum>k=1..<n. f k)" unfolding f'_def by simp |
271 also have "\<dots> \<longleftrightarrow> Bseq (\<lambda>n. \<Sum>k=1..<n. f k)" unfolding f'_def by simp |
272 also have "\<dots> \<longleftrightarrow> Bseq (\<lambda>n. \<Sum>k=1..<2^n. f k)" |
272 also have "\<dots> \<longleftrightarrow> Bseq (\<lambda>n. \<Sum>k=1..<2^n. f k)" |
273 by (rule nonneg_incseq_Bseq_subseq_iff[symmetric]) |
273 by (rule nonneg_incseq_Bseq_subseq_iff[symmetric]) |
274 (auto intro!: setsum_nonneg incseq_SucI nonneg simp: subseq_def) |
274 (auto intro!: sum_nonneg incseq_SucI nonneg simp: subseq_def) |
275 also have "\<dots> \<longleftrightarrow> Bseq (\<lambda>n. \<Sum>k<n. 2^k * f (2^k))" |
275 also have "\<dots> \<longleftrightarrow> Bseq (\<lambda>n. \<Sum>k<n. 2^k * f (2^k))" |
276 proof (intro iffI) |
276 proof (intro iffI) |
277 assume A: "Bseq (\<lambda>n. \<Sum>k=1..<2^n. f k)" |
277 assume A: "Bseq (\<lambda>n. \<Sum>k=1..<2^n. f k)" |
278 have "eventually (\<lambda>n. norm (\<Sum>k<n. 2^k * f (2^Suc k)) \<le> norm (\<Sum>k=1..<2^n. f k)) sequentially" |
278 have "eventually (\<lambda>n. norm (\<Sum>k<n. 2^k * f (2^Suc k)) \<le> norm (\<Sum>k=1..<2^n. f k)) sequentially" |
279 proof (intro always_eventually allI) |
279 proof (intro always_eventually allI) |
280 fix n :: nat |
280 fix n :: nat |
281 have "norm (\<Sum>k<n. 2^k * f (2^Suc k)) = (\<Sum>k<n. 2^k * f (2^Suc k))" unfolding real_norm_def |
281 have "norm (\<Sum>k<n. 2^k * f (2^Suc k)) = (\<Sum>k<n. 2^k * f (2^Suc k))" unfolding real_norm_def |
282 by (intro abs_of_nonneg setsum_nonneg ballI mult_nonneg_nonneg nonneg) simp_all |
282 by (intro abs_of_nonneg sum_nonneg ballI mult_nonneg_nonneg nonneg) simp_all |
283 also have "\<dots> \<le> (\<Sum>k=1..<2^n. f k)" |
283 also have "\<dots> \<le> (\<Sum>k=1..<2^n. f k)" |
284 by (subst condensation_condense2 [symmetric]) (intro condensation_inequality mono') |
284 by (subst condensation_condense2 [symmetric]) (intro condensation_inequality mono') |
285 also have "\<dots> = norm \<dots>" unfolding real_norm_def |
285 also have "\<dots> = norm \<dots>" unfolding real_norm_def |
286 by (intro abs_of_nonneg[symmetric] setsum_nonneg ballI mult_nonneg_nonneg nonneg) |
286 by (intro abs_of_nonneg[symmetric] sum_nonneg ballI mult_nonneg_nonneg nonneg) |
287 finally show "norm (\<Sum>k<n. 2 ^ k * f (2 ^ Suc k)) \<le> norm (\<Sum>k=1..<2^n. f k)" . |
287 finally show "norm (\<Sum>k<n. 2 ^ k * f (2 ^ Suc k)) \<le> norm (\<Sum>k=1..<2^n. f k)" . |
288 qed |
288 qed |
289 from this and A have "Bseq (\<lambda>n. \<Sum>k<n. 2^k * f (2^Suc k))" by (rule Bseq_eventually_mono) |
289 from this and A have "Bseq (\<lambda>n. \<Sum>k<n. 2^k * f (2^Suc k))" by (rule Bseq_eventually_mono) |
290 from Bseq_mult[OF Bfun_const[of 2] this] have "Bseq (\<lambda>n. \<Sum>k<n. 2^Suc k * f (2^Suc k))" |
290 from Bseq_mult[OF Bfun_const[of 2] this] have "Bseq (\<lambda>n. \<Sum>k<n. 2^Suc k * f (2^Suc k))" |
291 by (simp add: setsum_distrib_left setsum_distrib_right mult_ac) |
291 by (simp add: sum_distrib_left sum_distrib_right mult_ac) |
292 hence "Bseq (\<lambda>n. (\<Sum>k=Suc 0..<Suc n. 2^k * f (2^k)) + f 1)" |
292 hence "Bseq (\<lambda>n. (\<Sum>k=Suc 0..<Suc n. 2^k * f (2^k)) + f 1)" |
293 by (intro Bseq_add, subst setsum_shift_bounds_Suc_ivl) (simp add: atLeast0LessThan) |
293 by (intro Bseq_add, subst sum_shift_bounds_Suc_ivl) (simp add: atLeast0LessThan) |
294 hence "Bseq (\<lambda>n. (\<Sum>k=0..<Suc n. 2^k * f (2^k)))" |
294 hence "Bseq (\<lambda>n. (\<Sum>k=0..<Suc n. 2^k * f (2^k)))" |
295 by (subst setsum_head_upt_Suc) (simp_all add: add_ac) |
295 by (subst sum_head_upt_Suc) (simp_all add: add_ac) |
296 thus "Bseq (\<lambda>n. (\<Sum>k<n. 2^k * f (2^k)))" |
296 thus "Bseq (\<lambda>n. (\<Sum>k<n. 2^k * f (2^k)))" |
297 by (subst (asm) Bseq_Suc_iff) (simp add: atLeast0LessThan) |
297 by (subst (asm) Bseq_Suc_iff) (simp add: atLeast0LessThan) |
298 next |
298 next |
299 assume A: "Bseq (\<lambda>n. (\<Sum>k<n. 2^k * f (2^k)))" |
299 assume A: "Bseq (\<lambda>n. (\<Sum>k<n. 2^k * f (2^k)))" |
300 have "eventually (\<lambda>n. norm (\<Sum>k=1..<2^n. f k) \<le> norm (\<Sum>k<n. 2^k * f (2^k))) sequentially" |
300 have "eventually (\<lambda>n. norm (\<Sum>k=1..<2^n. f k) \<le> norm (\<Sum>k<n. 2^k * f (2^k))) sequentially" |
301 proof (intro always_eventually allI) |
301 proof (intro always_eventually allI) |
302 fix n :: nat |
302 fix n :: nat |
303 have "norm (\<Sum>k=1..<2^n. f k) = (\<Sum>k=1..<2^n. f k)" unfolding real_norm_def |
303 have "norm (\<Sum>k=1..<2^n. f k) = (\<Sum>k=1..<2^n. f k)" unfolding real_norm_def |
304 by (intro abs_of_nonneg setsum_nonneg ballI mult_nonneg_nonneg nonneg) |
304 by (intro abs_of_nonneg sum_nonneg ballI mult_nonneg_nonneg nonneg) |
305 also have "\<dots> \<le> (\<Sum>k<n. 2^k * f (2^k))" |
305 also have "\<dots> \<le> (\<Sum>k<n. 2^k * f (2^k))" |
306 by (subst condensation_condense1 [symmetric]) (intro condensation_inequality mono') |
306 by (subst condensation_condense1 [symmetric]) (intro condensation_inequality mono') |
307 also have "\<dots> = norm \<dots>" unfolding real_norm_def |
307 also have "\<dots> = norm \<dots>" unfolding real_norm_def |
308 by (intro abs_of_nonneg [symmetric] setsum_nonneg ballI mult_nonneg_nonneg nonneg) simp_all |
308 by (intro abs_of_nonneg [symmetric] sum_nonneg ballI mult_nonneg_nonneg nonneg) simp_all |
309 finally show "norm (\<Sum>k=1..<2^n. f k) \<le> norm (\<Sum>k<n. 2^k * f (2^k))" . |
309 finally show "norm (\<Sum>k=1..<2^n. f k) \<le> norm (\<Sum>k<n. 2^k * f (2^k))" . |
310 qed |
310 qed |
311 from this and A show "Bseq (\<lambda>n. \<Sum>k=1..<2^n. f k)" by (rule Bseq_eventually_mono) |
311 from this and A show "Bseq (\<lambda>n. \<Sum>k=1..<2^n. f k)" by (rule Bseq_eventually_mono) |
312 qed |
312 qed |
313 also have "monoseq (\<lambda>n. (\<Sum>k<n. 2^k * f (2^k)))" |
313 also have "monoseq (\<lambda>n. (\<Sum>k<n. 2^k * f (2^k)))" |
382 assume "summable (\<lambda>n. inverse (of_nat n) :: 'a)" |
382 assume "summable (\<lambda>n. inverse (of_nat n) :: 'a)" |
383 hence "convergent (\<lambda>n. norm (of_real (\<Sum>k<n. inverse (of_nat k)) :: 'a))" |
383 hence "convergent (\<lambda>n. norm (of_real (\<Sum>k<n. inverse (of_nat k)) :: 'a))" |
384 by (simp add: summable_iff_convergent convergent_norm) |
384 by (simp add: summable_iff_convergent convergent_norm) |
385 hence "convergent (\<lambda>n. abs (\<Sum>k<n. inverse (of_nat k)) :: real)" by (simp only: norm_of_real) |
385 hence "convergent (\<lambda>n. abs (\<Sum>k<n. inverse (of_nat k)) :: real)" by (simp only: norm_of_real) |
386 also have "(\<lambda>n. abs (\<Sum>k<n. inverse (of_nat k)) :: real) = (\<lambda>n. \<Sum>k<n. inverse (of_nat k))" |
386 also have "(\<lambda>n. abs (\<Sum>k<n. inverse (of_nat k)) :: real) = (\<lambda>n. \<Sum>k<n. inverse (of_nat k))" |
387 by (intro ext abs_of_nonneg setsum_nonneg) auto |
387 by (intro ext abs_of_nonneg sum_nonneg) auto |
388 also have "convergent \<dots> \<longleftrightarrow> summable (\<lambda>k. inverse (of_nat k) :: real)" |
388 also have "convergent \<dots> \<longleftrightarrow> summable (\<lambda>k. inverse (of_nat k) :: real)" |
389 by (simp add: summable_iff_convergent) |
389 by (simp add: summable_iff_convergent) |
390 finally show False using summable_real_powr_iff[of "-1"] by (simp add: powr_minus) |
390 finally show False using summable_real_powr_iff[of "-1"] by (simp add: powr_minus) |
391 qed |
391 qed |
392 |
392 |
422 fix k :: nat |
422 fix k :: nat |
423 define n where "n = k + Suc m" |
423 define n where "n = k + Suc m" |
424 have n: "n > m" by (simp add: n_def) |
424 have n: "n > m" by (simp add: n_def) |
425 |
425 |
426 from r have "r * norm (\<Sum>k\<le>n. f k) = norm (\<Sum>k\<le>n. r * f k)" |
426 from r have "r * norm (\<Sum>k\<le>n. f k) = norm (\<Sum>k\<le>n. r * f k)" |
427 by (simp add: setsum_distrib_left[symmetric] abs_mult) |
427 by (simp add: sum_distrib_left[symmetric] abs_mult) |
428 also from n have "{..n} = {..m} \<union> {Suc m..n}" by auto |
428 also from n have "{..n} = {..m} \<union> {Suc m..n}" by auto |
429 hence "(\<Sum>k\<le>n. r * f k) = (\<Sum>k\<in>{..m} \<union> {Suc m..n}. r * f k)" by (simp only:) |
429 hence "(\<Sum>k\<le>n. r * f k) = (\<Sum>k\<in>{..m} \<union> {Suc m..n}. r * f k)" by (simp only:) |
430 also have "\<dots> = (\<Sum>k\<le>m. r * f k) + (\<Sum>k=Suc m..n. r * f k)" |
430 also have "\<dots> = (\<Sum>k\<le>m. r * f k) + (\<Sum>k=Suc m..n. r * f k)" |
431 by (subst setsum.union_disjoint) auto |
431 by (subst sum.union_disjoint) auto |
432 also have "norm \<dots> \<le> norm (\<Sum>k\<le>m. r * f k) + norm (\<Sum>k=Suc m..n. r * f k)" |
432 also have "norm \<dots> \<le> norm (\<Sum>k\<le>m. r * f k) + norm (\<Sum>k=Suc m..n. r * f k)" |
433 by (rule norm_triangle_ineq) |
433 by (rule norm_triangle_ineq) |
434 also from r less_imp_le[OF m(1)] have "(\<Sum>k=Suc m..n. r * f k) \<ge> 0" |
434 also from r less_imp_le[OF m(1)] have "(\<Sum>k=Suc m..n. r * f k) \<ge> 0" |
435 by (intro setsum_nonneg) auto |
435 by (intro sum_nonneg) auto |
436 hence "norm (\<Sum>k=Suc m..n. r * f k) = (\<Sum>k=Suc m..n. r * f k)" by simp |
436 hence "norm (\<Sum>k=Suc m..n. r * f k) = (\<Sum>k=Suc m..n. r * f k)" by simp |
437 also have "(\<Sum>k=Suc m..n. r * f k) = (\<Sum>k=m..<n. r * f (Suc k))" |
437 also have "(\<Sum>k=Suc m..n. r * f k) = (\<Sum>k=m..<n. r * f (Suc k))" |
438 by (subst setsum_shift_bounds_Suc_ivl [symmetric]) |
438 by (subst sum_shift_bounds_Suc_ivl [symmetric]) |
439 (simp only: atLeastLessThanSuc_atLeastAtMost) |
439 (simp only: atLeastLessThanSuc_atLeastAtMost) |
440 also from m have "\<dots> \<le> (\<Sum>k=m..<n. p k * f k - p (Suc k) * f (Suc k))" |
440 also from m have "\<dots> \<le> (\<Sum>k=m..<n. p k * f k - p (Suc k) * f (Suc k))" |
441 by (intro setsum_mono[OF less_imp_le]) simp_all |
441 by (intro sum_mono[OF less_imp_le]) simp_all |
442 also have "\<dots> = -(\<Sum>k=m..<n. p (Suc k) * f (Suc k) - p k * f k)" |
442 also have "\<dots> = -(\<Sum>k=m..<n. p (Suc k) * f (Suc k) - p k * f k)" |
443 by (simp add: setsum_negf [symmetric] algebra_simps) |
443 by (simp add: sum_negf [symmetric] algebra_simps) |
444 also from n have "\<dots> = p m * f m - p n * f n" |
444 also from n have "\<dots> = p m * f m - p n * f n" |
445 by (cases n, simp, simp only: atLeastLessThanSuc_atLeastAtMost, subst setsum_Suc_diff) simp_all |
445 by (cases n, simp, simp only: atLeastLessThanSuc_atLeastAtMost, subst sum_Suc_diff) simp_all |
446 also from less_imp_le[OF m(1)] m(2) n have "\<dots> \<le> p m * f m" by simp |
446 also from less_imp_le[OF m(1)] m(2) n have "\<dots> \<le> p m * f m" by simp |
447 finally show "norm (\<Sum>k\<le>n. f k) \<le> (norm (\<Sum>k\<le>m. r * f k) + p m * f m) / r" using r |
447 finally show "norm (\<Sum>k\<le>n. f k) \<le> (norm (\<Sum>k\<le>m. r * f k) + p m * f m) / r" using r |
448 by (subst pos_le_divide_eq[OF r(1)]) (simp only: mult_ac) |
448 by (subst pos_le_divide_eq[OF r(1)]) (simp only: mult_ac) |
449 qed |
449 qed |
450 moreover have "(\<Sum>k\<le>n. f k) \<le> (\<Sum>k\<le>n'. f k)" if "Suc m \<le> n" "n \<le> n'" for n n' |
450 moreover have "(\<Sum>k\<le>n. f k) \<le> (\<Sum>k\<le>n'. f k)" if "Suc m \<le> n" "n \<le> n'" for n n' |
451 using less_imp_le[OF m(1)] that by (intro setsum_mono2) auto |
451 using less_imp_le[OF m(1)] that by (intro sum_mono2) auto |
452 ultimately show "convergent (\<lambda>n. \<Sum>k\<le>n. f k)" by (rule Bseq_monoseq_convergent'_inc) |
452 ultimately show "convergent (\<lambda>n. \<Sum>k\<le>n. f k)" by (rule Bseq_monoseq_convergent'_inc) |
453 qed |
453 qed |
454 |
454 |
455 |
455 |
456 lemma kummers_test_divergence: |
456 lemma kummers_test_divergence: |
903 proof (rule conv_radius_geI_ex') |
903 proof (rule conv_radius_geI_ex') |
904 fix r assume r: "r > 0" "ereal r < min (conv_radius f) (conv_radius g)" |
904 fix r assume r: "r > 0" "ereal r < min (conv_radius f) (conv_radius g)" |
905 from r have "summable (\<lambda>n. (\<Sum>i\<le>n. (f i * of_real r^i) * (g (n - i) * of_real r^(n - i))))" |
905 from r have "summable (\<lambda>n. (\<Sum>i\<le>n. (f i * of_real r^i) * (g (n - i) * of_real r^(n - i))))" |
906 by (intro summable_Cauchy_product abs_summable_in_conv_radius) simp_all |
906 by (intro summable_Cauchy_product abs_summable_in_conv_radius) simp_all |
907 thus "summable (\<lambda>n. (\<Sum>i\<le>n. f i * g (n - i)) * of_real r ^ n)" |
907 thus "summable (\<lambda>n. (\<Sum>i\<le>n. f i * g (n - i)) * of_real r ^ n)" |
908 by (simp add: algebra_simps of_real_def power_add [symmetric] scaleR_setsum_right) |
908 by (simp add: algebra_simps of_real_def power_add [symmetric] scaleR_sum_right) |
909 qed |
909 qed |
910 |
910 |
911 lemma le_conv_radius_iff: |
911 lemma le_conv_radius_iff: |
912 fixes a :: "nat \<Rightarrow> 'a::{real_normed_div_algebra,banach}" |
912 fixes a :: "nat \<Rightarrow> 'a::{real_normed_div_algebra,banach}" |
913 shows "r \<le> conv_radius a \<longleftrightarrow> (\<forall>x. norm (x-\<xi>) < r \<longrightarrow> summable (\<lambda>i. a i * (x - \<xi>) ^ i))" |
913 shows "r \<le> conv_radius a \<longleftrightarrow> (\<forall>x. norm (x-\<xi>) < r \<longrightarrow> summable (\<lambda>i. a i * (x - \<xi>) ^ i))" |