src/HOL/Analysis/Summation_Tests.thy
changeset 64267 b9a1486e79be
parent 63992 3aa9837d05c7
child 64449 8c44dfb4ca8a
equal deleted inserted replaced
64265:8eb6365f5916 64267:b9a1486e79be
   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))"