paulson@10751: (* Title : Series.thy paulson@10751: Author : Jacques D. Fleuriot paulson@10751: Copyright : 1998 University of Cambridge paulson@14416: paulson@14416: Converted to Isar and polished by lcp nipkow@15539: Converted to setsum and polished yet more by TNN avigad@16819: Additional contributions by Jeremy Avigad paulson@10751: *) paulson@10751: paulson@14416: header{*Finite Summation and Infinite Series*} paulson@10751: nipkow@15131: theory Series haftmann@29197: imports SEQ nipkow@15131: begin nipkow@15561: wenzelm@19765: definition huffman@20692: sums :: "(nat \ 'a::real_normed_vector) \ 'a \ bool" wenzelm@21404: (infixr "sums" 80) where wenzelm@19765: "f sums s = (%n. setsum f {0.. s" paulson@10751: wenzelm@21404: definition wenzelm@21404: summable :: "(nat \ 'a::real_normed_vector) \ bool" where wenzelm@19765: "summable f = (\s. f sums s)" paulson@14416: wenzelm@21404: definition wenzelm@21404: suminf :: "(nat \ 'a::real_normed_vector) \ 'a" where huffman@20688: "suminf f = (THE s. f sums s)" paulson@14416: nipkow@15546: syntax huffman@20692: "_suminf" :: "idt \ 'a \ 'a" ("\_. _" [0, 10] 10) nipkow@15546: translations wenzelm@20770: "\i. b" == "CONST suminf (%i. b)" nipkow@15546: paulson@14416: nipkow@15539: lemma sumr_diff_mult_const: nipkow@15539: "setsum f {0.. f(p) \ K) nipkow@15542: \ setsum f {0.. real n * K" nipkow@15542: using setsum_bounded[where A = "{0..i=0..<2*n. (-1) ^ Suc i) = (0::real)" paulson@15251: by (induct "n", auto) paulson@14416: nipkow@15539: (* FIXME this is an awful lemma! *) nipkow@15539: lemma sumr_one_lb_realpow_zero [simp]: nipkow@15539: "(\n=Suc 0..m=0..m=0.. 'a::ab_group_add" huffman@20692: shows "(\m=0..f. (\m=0..n f. setsum f {0::nat..m=0.. avigad@16819: (\n=Suc 0 ..< Suc n. if even(n) then 0 else avigad@16819: ((- 1) ^ ((n - (Suc 0)) div 2))/(real (fact n))) * a ^ n = avigad@16819: (\n=0.. summable f" paulson@14416: by (simp add: sums_def summable_def, blast) paulson@14416: paulson@14416: lemma summable_sums: "summable f ==> f sums (suminf f)" huffman@20688: apply (simp add: summable_def suminf_def sums_def) huffman@20688: apply (blast intro: theI LIMSEQ_unique) paulson@14416: done paulson@14416: paulson@14416: lemma summable_sumr_LIMSEQ_suminf: nipkow@15539: "summable f ==> (%n. setsum f {0.. (suminf f)" huffman@20688: by (rule summable_sums [unfolded sums_def]) paulson@14416: paulson@14416: (*------------------- paulson@14416: sum is unique paulson@14416: ------------------*) paulson@14416: lemma sums_unique: "f sums s ==> (s = suminf f)" paulson@14416: apply (frule sums_summable [THEN summable_sums]) paulson@14416: apply (auto intro!: LIMSEQ_unique simp add: sums_def) paulson@14416: done paulson@14416: avigad@16819: lemma sums_split_initial_segment: "f sums s ==> avigad@16819: (%n. f(n + k)) sums (s - (SUM i = 0..< k. f i))" avigad@16819: apply (unfold sums_def); avigad@16819: apply (simp add: sumr_offset); avigad@16819: apply (rule LIMSEQ_diff_const) avigad@16819: apply (rule LIMSEQ_ignore_initial_segment) avigad@16819: apply assumption avigad@16819: done avigad@16819: avigad@16819: lemma summable_ignore_initial_segment: "summable f ==> avigad@16819: summable (%n. f(n + k))" avigad@16819: apply (unfold summable_def) avigad@16819: apply (auto intro: sums_split_initial_segment) avigad@16819: done avigad@16819: avigad@16819: lemma suminf_minus_initial_segment: "summable f ==> avigad@16819: suminf f = s ==> suminf (%n. f(n + k)) = s - (SUM i = 0..< k. f i)" avigad@16819: apply (frule summable_ignore_initial_segment) avigad@16819: apply (rule sums_unique [THEN sym]) avigad@16819: apply (frule summable_sums) avigad@16819: apply (rule sums_split_initial_segment) avigad@16819: apply auto avigad@16819: done avigad@16819: avigad@16819: lemma suminf_split_initial_segment: "summable f ==> avigad@16819: suminf f = (SUM i = 0..< k. f i) + suminf (%n. f(n + k))" avigad@16819: by (auto simp add: suminf_minus_initial_segment) avigad@16819: hoelzl@29803: lemma suminf_exist_split: fixes r :: real assumes "0 < r" and "summable a" hoelzl@29803: shows "\ N. \ n \ N. \ \ i. a (i + n) \ < r" hoelzl@29803: proof - hoelzl@29803: from LIMSEQ_D[OF summable_sumr_LIMSEQ_suminf[OF `summable a`] `0 < r`] hoelzl@29803: obtain N :: nat where "\ n \ N. norm (setsum a {0.. n. f (Suc n)) sums l" shows "f sums (l + f 0)" hoelzl@29803: proof - hoelzl@29803: from sumSuc[unfolded sums_def] hoelzl@29803: have "(\i. \n = Suc 0.. l" unfolding setsum_reindex[OF inj_Suc] image_Suc_atLeastLessThan[symmetric] comp_def . hoelzl@29803: from LIMSEQ_add_const[OF this, where b="f 0"] hoelzl@29803: have "(\i. \n = 0.. l + f 0" unfolding add_commute setsum_head_upt_Suc[OF zero_less_Suc] . hoelzl@29803: thus ?thesis unfolding sums_def by (rule LIMSEQ_imp_Suc) hoelzl@29803: qed hoelzl@29803: paulson@14416: lemma series_zero: nipkow@15539: "(\m. n \ m --> f(m) = 0) ==> f sums (setsum f {0..n. 0) sums 0" huffman@23121: unfolding sums_def by (simp add: LIMSEQ_const) nipkow@15539: huffman@23121: lemma summable_zero: "summable (\n. 0)" huffman@23121: by (rule sums_zero [THEN sums_summable]) avigad@16819: huffman@23121: lemma suminf_zero: "suminf (\n. 0) = 0" huffman@23121: by (rule sums_zero [THEN sums_unique, symmetric]) avigad@16819: huffman@23119: lemma (in bounded_linear) sums: huffman@23119: "(\n. X n) sums a \ (\n. f (X n)) sums (f a)" huffman@23119: unfolding sums_def by (drule LIMSEQ, simp only: setsum) huffman@23119: huffman@23119: lemma (in bounded_linear) summable: huffman@23119: "summable (\n. X n) \ summable (\n. f (X n))" huffman@23119: unfolding summable_def by (auto intro: sums) huffman@23119: huffman@23119: lemma (in bounded_linear) suminf: huffman@23119: "summable (\n. X n) \ f (\n. X n) = (\n. f (X n))" huffman@23121: by (intro sums_unique sums summable_sums) huffman@23119: huffman@20692: lemma sums_mult: huffman@20692: fixes c :: "'a::real_normed_algebra" huffman@20692: shows "f sums a \ (\n. c * f n) sums (c * a)" huffman@23127: by (rule mult_right.sums) paulson@14416: huffman@20692: lemma summable_mult: huffman@20692: fixes c :: "'a::real_normed_algebra" huffman@23121: shows "summable f \ summable (%n. c * f n)" huffman@23127: by (rule mult_right.summable) avigad@16819: huffman@20692: lemma suminf_mult: huffman@20692: fixes c :: "'a::real_normed_algebra" huffman@20692: shows "summable f \ suminf (\n. c * f n) = c * suminf f"; huffman@23127: by (rule mult_right.suminf [symmetric]) avigad@16819: huffman@20692: lemma sums_mult2: huffman@20692: fixes c :: "'a::real_normed_algebra" huffman@20692: shows "f sums a \ (\n. f n * c) sums (a * c)" huffman@23127: by (rule mult_left.sums) avigad@16819: huffman@20692: lemma summable_mult2: huffman@20692: fixes c :: "'a::real_normed_algebra" huffman@20692: shows "summable f \ summable (\n. f n * c)" huffman@23127: by (rule mult_left.summable) avigad@16819: huffman@20692: lemma suminf_mult2: huffman@20692: fixes c :: "'a::real_normed_algebra" huffman@20692: shows "summable f \ suminf f * c = (\n. f n * c)" huffman@23127: by (rule mult_left.suminf) avigad@16819: huffman@20692: lemma sums_divide: huffman@20692: fixes c :: "'a::real_normed_field" huffman@20692: shows "f sums a \ (\n. f n / c) sums (a / c)" huffman@23127: by (rule divide.sums) paulson@14416: huffman@20692: lemma summable_divide: huffman@20692: fixes c :: "'a::real_normed_field" huffman@20692: shows "summable f \ summable (\n. f n / c)" huffman@23127: by (rule divide.summable) avigad@16819: huffman@20692: lemma suminf_divide: huffman@20692: fixes c :: "'a::real_normed_field" huffman@20692: shows "summable f \ suminf (\n. f n / c) = suminf f / c" huffman@23127: by (rule divide.suminf [symmetric]) avigad@16819: huffman@23121: lemma sums_add: "\X sums a; Y sums b\ \ (\n. X n + Y n) sums (a + b)" huffman@23121: unfolding sums_def by (simp add: setsum_addf LIMSEQ_add) avigad@16819: huffman@23121: lemma summable_add: "\summable X; summable Y\ \ summable (\n. X n + Y n)" huffman@23121: unfolding summable_def by (auto intro: sums_add) avigad@16819: avigad@16819: lemma suminf_add: huffman@23121: "\summable X; summable Y\ \ suminf X + suminf Y = (\n. X n + Y n)" huffman@23121: by (intro sums_unique sums_add summable_sums) paulson@14416: huffman@23121: lemma sums_diff: "\X sums a; Y sums b\ \ (\n. X n - Y n) sums (a - b)" huffman@23121: unfolding sums_def by (simp add: setsum_subtractf LIMSEQ_diff) huffman@23121: huffman@23121: lemma summable_diff: "\summable X; summable Y\ \ summable (\n. X n - Y n)" huffman@23121: unfolding summable_def by (auto intro: sums_diff) paulson@14416: paulson@14416: lemma suminf_diff: huffman@23121: "\summable X; summable Y\ \ suminf X - suminf Y = (\n. X n - Y n)" huffman@23121: by (intro sums_unique sums_diff summable_sums) paulson@14416: huffman@23121: lemma sums_minus: "X sums a ==> (\n. - X n) sums (- a)" huffman@23121: unfolding sums_def by (simp add: setsum_negf LIMSEQ_minus) avigad@16819: huffman@23121: lemma summable_minus: "summable X \ summable (\n. - X n)" huffman@23121: unfolding summable_def by (auto intro: sums_minus) avigad@16819: huffman@23121: lemma suminf_minus: "summable X \ (\n. - X n) = - (\n. X n)" huffman@23121: by (intro sums_unique [symmetric] sums_minus summable_sums) paulson@14416: paulson@14416: lemma sums_group: nipkow@15539: "[|summable f; 0 < k |] ==> (%n. setsum f {n*k.. real" huffman@20692: shows "\summable f; \m\n. 0 \ f m\ \ setsum f {0.. suminf f" paulson@14416: apply (drule summable_sums) paulson@14416: apply (simp add: sums_def) nipkow@15539: apply (cut_tac k = "setsum f {0.. real" huffman@20692: shows "\summable f; \m\n. 0 < f m\ \ setsum f {0.. real" huffman@20692: shows "\summable f; \n. 0 < f n\ \ 0 < suminf f" huffman@20692: by (drule_tac n="0" in series_pos_less, simp_all) huffman@20692: huffman@20692: lemma suminf_ge_zero: huffman@20692: fixes f :: "nat \ real" huffman@20692: shows "\summable f; \n. 0 \ f n\ \ 0 \ suminf f" huffman@20692: by (drule_tac n="0" in series_pos_le, simp_all) huffman@20692: huffman@20692: lemma sumr_pos_lt_pair: huffman@20692: fixes f :: "nat \ real" huffman@20692: shows "\summable f; huffman@20692: \d. 0 < f (k + (Suc(Suc 0) * d)) + f (k + ((Suc(Suc 0) * d) + 1))\ huffman@20692: \ setsum f {0.. (\n. x ^ n) sums (1 / (1 - x))" huffman@20692: proof - huffman@20692: assume less_1: "norm x < 1" huffman@20692: hence neq_1: "x \ 1" by auto huffman@20692: hence neq_0: "x - 1 \ 0" by simp huffman@20692: from less_1 have lim_0: "(\n. x ^ n) ----> 0" huffman@20692: by (rule LIMSEQ_power_zero) huffman@22719: hence "(\n. x ^ n / (x - 1) - 1 / (x - 1)) ----> 0 / (x - 1) - 1 / (x - 1)" huffman@20692: using neq_0 by (intro LIMSEQ_divide LIMSEQ_diff LIMSEQ_const) huffman@20692: hence "(\n. (x ^ n - 1) / (x - 1)) ----> 1 / (1 - x)" huffman@20692: by (simp add: nonzero_minus_divide_right [OF neq_0] diff_divide_distrib) huffman@20692: thus "(\n. x ^ n) sums (1 / (1 - x))" huffman@20692: by (simp add: sums_def geometric_sum neq_1) huffman@20692: qed huffman@20692: huffman@20692: lemma summable_geometric: huffman@22719: fixes x :: "'a::{real_normed_field,recpower}" huffman@20692: shows "norm x < 1 \ summable (\n. x ^ n)" huffman@20692: by (rule geometric_sums [THEN sums_summable]) paulson@14416: paulson@15085: text{*Cauchy-type criterion for convergence of series (c.f. Harrison)*} paulson@15085: nipkow@15539: lemma summable_convergent_sumr_iff: nipkow@15539: "summable f = convergent (%n. setsum f {0.. f ----> 0" huffman@20689: apply (drule summable_convergent_sumr_iff [THEN iffD1]) huffman@20692: apply (drule convergent_Cauchy) huffman@20689: apply (simp only: Cauchy_def LIMSEQ_def, safe) huffman@20689: apply (drule_tac x="r" in spec, safe) huffman@20689: apply (rule_tac x="M" in exI, safe) huffman@20689: apply (drule_tac x="Suc n" in spec, simp) huffman@20689: apply (drule_tac x="n" in spec, simp) huffman@20689: done huffman@20689: paulson@14416: lemma summable_Cauchy: huffman@20848: "summable (f::nat \ 'a::banach) = huffman@20848: (\e > 0. \N. \m \ N. \n. norm (setsum f {m.. 'b::real_normed_vector" huffman@20692: shows "norm (setsum f A) \ (\i\A. norm (f i))" huffman@20692: apply (case_tac "finite A") huffman@20692: apply (erule finite_induct) huffman@20692: apply simp huffman@20692: apply simp huffman@20692: apply (erule order_trans [OF norm_triangle_ineq add_left_mono]) huffman@20692: apply simp huffman@20692: done huffman@20692: paulson@14416: lemma summable_comparison_test: huffman@20848: fixes f :: "nat \ 'a::banach" huffman@20848: shows "\\N. \n\N. norm (f n) \ g n; summable g\ \ summable f" huffman@20692: apply (simp add: summable_Cauchy, safe) huffman@20692: apply (drule_tac x="e" in spec, safe) huffman@20692: apply (rule_tac x = "N + Na" in exI, safe) paulson@14416: apply (rotate_tac 2) paulson@14416: apply (drule_tac x = m in spec) paulson@14416: apply (auto, rotate_tac 2, drule_tac x = n in spec) huffman@20848: apply (rule_tac y = "\k=m.. 'a::banach" huffman@20848: shows "\\N. \n\N. norm (f n) \ g n; summable g\ huffman@20848: \ summable (\n. norm (f n))" huffman@20848: apply (rule summable_comparison_test) huffman@20848: apply (auto) huffman@20848: done huffman@20848: paulson@14416: lemma summable_rabs_comparison_test: huffman@20692: fixes f :: "nat \ real" huffman@20692: shows "\\N. \n\N. \f n\ \ g n; summable g\ \ summable (\n. \f n\)" paulson@14416: apply (rule summable_comparison_test) nipkow@15543: apply (auto) paulson@14416: done paulson@14416: huffman@23084: text{*Summability of geometric series for real algebras*} huffman@23084: huffman@23084: lemma complete_algebra_summable_geometric: huffman@23084: fixes x :: "'a::{real_normed_algebra_1,banach,recpower}" huffman@23084: shows "norm x < 1 \ summable (\n. x ^ n)" huffman@23084: proof (rule summable_comparison_test) huffman@23084: show "\N. \n\N. norm (x ^ n) \ norm x ^ n" huffman@23084: by (simp add: norm_power_ineq) huffman@23084: show "norm x < 1 \ summable (\n. norm x ^ n)" huffman@23084: by (simp add: summable_geometric) huffman@23084: qed huffman@23084: paulson@15085: text{*Limit comparison property for series (c.f. jrh)*} paulson@15085: paulson@14416: lemma summable_le: huffman@20692: fixes f g :: "nat \ real" huffman@20692: shows "\\n. f n \ g n; summable f; summable g\ \ suminf f \ suminf g" paulson@14416: apply (drule summable_sums)+ huffman@20692: apply (simp only: sums_def, erule (1) LIMSEQ_le) paulson@14416: apply (rule exI) nipkow@15539: apply (auto intro!: setsum_mono) paulson@14416: done paulson@14416: paulson@14416: lemma summable_le2: huffman@20692: fixes f g :: "nat \ real" huffman@20692: shows "\\n. \f n\ \ g n; summable g\ \ summable f \ suminf f \ suminf g" huffman@20848: apply (subgoal_tac "summable f") huffman@20848: apply (auto intro!: summable_le) huffman@22998: apply (simp add: abs_le_iff) huffman@20848: apply (rule_tac g="g" in summable_comparison_test, simp_all) paulson@14416: done paulson@14416: kleing@19106: (* specialisation for the common 0 case *) kleing@19106: lemma suminf_0_le: kleing@19106: fixes f::"nat\real" kleing@19106: assumes gt0: "\n. 0 \ f n" and sm: "summable f" kleing@19106: shows "0 \ suminf f" kleing@19106: proof - kleing@19106: let ?g = "(\n. (0::real))" kleing@19106: from gt0 have "\n. ?g n \ f n" by simp kleing@19106: moreover have "summable ?g" by (rule summable_zero) kleing@19106: moreover from sm have "summable f" . kleing@19106: ultimately have "suminf ?g \ suminf f" by (rule summable_le) kleing@19106: then show "0 \ suminf f" by (simp add: suminf_zero) kleing@19106: qed kleing@19106: kleing@19106: paulson@15085: text{*Absolute convergence imples normal convergence*} huffman@20848: lemma summable_norm_cancel: huffman@20848: fixes f :: "nat \ 'a::banach" huffman@20848: shows "summable (\n. norm (f n)) \ summable f" huffman@20692: apply (simp only: summable_Cauchy, safe) huffman@20692: apply (drule_tac x="e" in spec, safe) huffman@20692: apply (rule_tac x="N" in exI, safe) huffman@20692: apply (drule_tac x="m" in spec, safe) huffman@20848: apply (rule order_le_less_trans [OF norm_setsum]) huffman@20848: apply (rule order_le_less_trans [OF abs_ge_self]) huffman@20692: apply simp paulson@14416: done paulson@14416: huffman@20848: lemma summable_rabs_cancel: huffman@20848: fixes f :: "nat \ real" huffman@20848: shows "summable (\n. \f n\) \ summable f" huffman@20848: by (rule summable_norm_cancel, simp) huffman@20848: paulson@15085: text{*Absolute convergence of series*} huffman@20848: lemma summable_norm: huffman@20848: fixes f :: "nat \ 'a::banach" huffman@20848: shows "summable (\n. norm (f n)) \ norm (suminf f) \ (\n. norm (f n))" huffman@20848: by (auto intro: LIMSEQ_le LIMSEQ_norm summable_norm_cancel huffman@20848: summable_sumr_LIMSEQ_suminf norm_setsum) huffman@20848: paulson@14416: lemma summable_rabs: huffman@20692: fixes f :: "nat \ real" huffman@20692: shows "summable (\n. \f n\) \ \suminf f\ \ (\n. \f n\)" huffman@20848: by (fold real_norm_def, rule summable_norm) paulson@14416: paulson@14416: subsection{* The Ratio Test*} paulson@14416: huffman@20848: lemma norm_ratiotest_lemma: huffman@22852: fixes x y :: "'a::real_normed_vector" huffman@20848: shows "\c \ 0; norm x \ c * norm y\ \ x = 0" huffman@20848: apply (subgoal_tac "norm x \ 0", simp) huffman@20848: apply (erule order_trans) huffman@20848: apply (simp add: mult_le_0_iff) huffman@20848: done huffman@20848: paulson@14416: lemma rabs_ratiotest_lemma: "[| c \ 0; abs x \ c * abs y |] ==> x = (0::real)" huffman@20848: by (erule norm_ratiotest_lemma, simp) paulson@14416: paulson@14416: lemma le_Suc_ex: "(k::nat) \ l ==> (\n. l = k + n)" paulson@14416: apply (drule le_imp_less_or_eq) paulson@14416: apply (auto dest: less_imp_Suc_add) paulson@14416: done paulson@14416: paulson@14416: lemma le_Suc_ex_iff: "((k::nat) \ l) = (\n. l = k + n)" paulson@14416: by (auto simp add: le_Suc_ex) paulson@14416: paulson@14416: (*All this trouble just to get 0 'a::banach" huffman@20848: shows "\\n\N. norm (f (Suc n)) \ c * norm (f n)\ \ 0 < c \ summable f" paulson@14416: apply (simp (no_asm) add: linorder_not_le [symmetric]) paulson@14416: apply (simp add: summable_Cauchy) nipkow@15543: apply (safe, subgoal_tac "\n. N < n --> f (n) = 0") nipkow@15543: prefer 2 nipkow@15543: apply clarify huffman@30082: apply(erule_tac x = "n - Suc 0" in allE) nipkow@15543: apply (simp add:diff_Suc split:nat.splits) huffman@20848: apply (blast intro: norm_ratiotest_lemma) paulson@14416: apply (rule_tac x = "Suc N" in exI, clarify) nipkow@15543: apply(simp cong:setsum_ivl_cong) paulson@14416: done paulson@14416: paulson@14416: lemma ratio_test: huffman@20848: fixes f :: "nat \ 'a::banach" huffman@20848: shows "\c < 1; \n\N. norm (f (Suc n)) \ c * norm (f n)\ \ summable f" paulson@14416: apply (frule ratio_test_lemma2, auto) huffman@20848: apply (rule_tac g = "%n. (norm (f N) / (c ^ N))*c ^ n" paulson@15234: in summable_comparison_test) paulson@14416: apply (rule_tac x = N in exI, safe) paulson@14416: apply (drule le_Suc_ex_iff [THEN iffD1]) huffman@22959: apply (auto simp add: power_add field_power_not_zero) nipkow@15539: apply (induct_tac "na", auto) huffman@20848: apply (rule_tac y = "c * norm (f (N + n))" in order_trans) paulson@14416: apply (auto intro: mult_right_mono simp add: summable_def) paulson@14416: apply (simp add: mult_ac) huffman@20848: apply (rule_tac x = "norm (f N) * (1/ (1 - c)) / (c ^ N)" in exI) paulson@15234: apply (rule sums_divide) haftmann@27108: apply (rule sums_mult) paulson@15234: apply (auto intro!: geometric_sums) paulson@14416: done paulson@14416: huffman@23111: subsection {* Cauchy Product Formula *} huffman@23111: huffman@23111: (* Proof based on Analysis WebNotes: Chapter 07, Class 41 huffman@23111: http://www.math.unl.edu/~webnotes/classes/class41/prp77.htm *) huffman@23111: huffman@23111: lemma setsum_triangle_reindex: huffman@23111: fixes n :: nat huffman@23111: shows "(\(i,j)\{(i,j). i+j < n}. f i j) = (\k=0..i=0..k. f i (k - i))" huffman@23111: proof - huffman@23111: have "(\(i, j)\{(i, j). i + j < n}. f i j) = huffman@23111: (\(k, i)\(SIGMA k:{0..(k,i). (i, k - i)) (SIGMA k:{0..(k,i). (i, k - i)) ` (SIGMA k:{0..a. (\(k, i). f i (k - i)) a = split f ((\(k, i). (i, k - i)) a)" huffman@23111: by clarify huffman@23111: qed huffman@23111: thus ?thesis by (simp add: setsum_Sigma) huffman@23111: qed huffman@23111: huffman@23111: lemma Cauchy_product_sums: huffman@23111: fixes a b :: "nat \ 'a::{real_normed_algebra,banach}" huffman@23111: assumes a: "summable (\k. norm (a k))" huffman@23111: assumes b: "summable (\k. norm (b k))" huffman@23111: shows "(\k. \i=0..k. a i * b (k - i)) sums ((\k. a k) * (\k. b k))" huffman@23111: proof - huffman@23111: let ?S1 = "\n::nat. {0.. {0..m n. m \ n \ ?S1 m \ ?S1 n" by auto huffman@23111: have S2_le_S1: "\n. ?S2 n \ ?S1 n" by auto huffman@23111: have S1_le_S2: "\n. ?S1 (n div 2) \ ?S2 n" by auto huffman@23111: have finite_S1: "\n. finite (?S1 n)" by simp huffman@23111: with S2_le_S1 have finite_S2: "\n. finite (?S2 n)" by (rule finite_subset) huffman@23111: huffman@23111: let ?g = "\(i,j). a i * b j" huffman@23111: let ?f = "\(i,j). norm (a i) * norm (b j)" huffman@23111: have f_nonneg: "\x. 0 \ ?f x" huffman@23111: by (auto simp add: mult_nonneg_nonneg) huffman@23111: hence norm_setsum_f: "\A. norm (setsum ?f A) = setsum ?f A" huffman@23111: unfolding real_norm_def huffman@23111: by (simp only: abs_of_nonneg setsum_nonneg [rule_format]) huffman@23111: huffman@23111: have "(\n. (\k=0..k=0.. (\k. a k) * (\k. b k)" huffman@23111: by (intro LIMSEQ_mult summable_sumr_LIMSEQ_suminf huffman@23111: summable_norm_cancel [OF a] summable_norm_cancel [OF b]) huffman@23111: hence 1: "(\n. setsum ?g (?S1 n)) ----> (\k. a k) * (\k. b k)" huffman@23111: by (simp only: setsum_product setsum_Sigma [rule_format] huffman@23111: finite_atLeastLessThan) huffman@23111: huffman@23111: have "(\n. (\k=0..k=0.. (\k. norm (a k)) * (\k. norm (b k))" huffman@23111: using a b by (intro LIMSEQ_mult summable_sumr_LIMSEQ_suminf) huffman@23111: hence "(\n. setsum ?f (?S1 n)) ----> (\k. norm (a k)) * (\k. norm (b k))" huffman@23111: by (simp only: setsum_product setsum_Sigma [rule_format] huffman@23111: finite_atLeastLessThan) huffman@23111: hence "convergent (\n. setsum ?f (?S1 n))" huffman@23111: by (rule convergentI) huffman@23111: hence Cauchy: "Cauchy (\n. setsum ?f (?S1 n))" huffman@23111: by (rule convergent_Cauchy) huffman@23111: have "Zseq (\n. setsum ?f (?S1 n - ?S2 n))" huffman@23111: proof (rule ZseqI, simp only: norm_setsum_f) huffman@23111: fix r :: real huffman@23111: assume r: "0 < r" huffman@23111: from CauchyD [OF Cauchy r] obtain N huffman@23111: where "\m\N. \n\N. norm (setsum ?f (?S1 m) - setsum ?f (?S1 n)) < r" .. huffman@23111: hence "\m n. \N \ n; n \ m\ \ norm (setsum ?f (?S1 m - ?S1 n)) < r" huffman@23111: by (simp only: setsum_diff finite_S1 S1_mono) huffman@23111: hence N: "\m n. \N \ n; n \ m\ \ setsum ?f (?S1 m - ?S1 n) < r" huffman@23111: by (simp only: norm_setsum_f) huffman@23111: show "\N. \n\N. setsum ?f (?S1 n - ?S2 n) < r" huffman@23111: proof (intro exI allI impI) huffman@23111: fix n assume "2 * N \ n" huffman@23111: hence n: "N \ n div 2" by simp huffman@23111: have "setsum ?f (?S1 n - ?S2 n) \ setsum ?f (?S1 n - ?S1 (n div 2))" huffman@23111: by (intro setsum_mono2 finite_Diff finite_S1 f_nonneg huffman@23111: Diff_mono subset_refl S1_le_S2) huffman@23111: also have "\ < r" huffman@23111: using n div_le_dividend by (rule N) huffman@23111: finally show "setsum ?f (?S1 n - ?S2 n) < r" . huffman@23111: qed huffman@23111: qed huffman@23111: hence "Zseq (\n. setsum ?g (?S1 n - ?S2 n))" huffman@23111: apply (rule Zseq_le [rule_format]) huffman@23111: apply (simp only: norm_setsum_f) huffman@23111: apply (rule order_trans [OF norm_setsum setsum_mono]) huffman@23111: apply (auto simp add: norm_mult_ineq) huffman@23111: done huffman@23111: hence 2: "(\n. setsum ?g (?S1 n) - setsum ?g (?S2 n)) ----> 0" huffman@23111: by (simp only: LIMSEQ_Zseq_iff setsum_diff finite_S1 S2_le_S1 diff_0_right) huffman@23111: huffman@23111: with 1 have "(\n. setsum ?g (?S2 n)) ----> (\k. a k) * (\k. b k)" huffman@23111: by (rule LIMSEQ_diff_approach_zero2) huffman@23111: thus ?thesis by (simp only: sums_def setsum_triangle_reindex) huffman@23111: qed huffman@23111: huffman@23111: lemma Cauchy_product: huffman@23111: fixes a b :: "nat \ 'a::{real_normed_algebra,banach}" huffman@23111: assumes a: "summable (\k. norm (a k))" huffman@23111: assumes b: "summable (\k. norm (b k))" huffman@23111: shows "(\k. a k) * (\k. b k) = (\k. \i=0..k. a i * b (k - i))" huffman@23441: using a b huffman@23111: by (rule Cauchy_product_sums [THEN sums_unique]) huffman@23111: paulson@14416: end