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 hoelzl@41970: *) paulson@10751: paulson@14416: header{*Finite Summation and Infinite Series*} paulson@10751: nipkow@15131: theory Series paulson@33271: imports SEQ Deriv nipkow@15131: begin nipkow@15561: wenzelm@19765: definition hoelzl@41970: sums :: "(nat \ 'a::{topological_space, comm_monoid_add}) \ 'a \ bool" wenzelm@21404: (infixr "sums" 80) where wenzelm@19765: "f sums s = (%n. setsum f {0.. s" paulson@10751: wenzelm@21404: definition hoelzl@41970: summable :: "(nat \ 'a::{topological_space, comm_monoid_add}) \ bool" where wenzelm@19765: "summable f = (\s. f sums s)" paulson@14416: wenzelm@21404: definition hoelzl@41970: suminf :: "(nat \ 'a::{topological_space, comm_monoid_add}) \ 'a" where huffman@20688: "suminf f = (THE s. f sums s)" paulson@14416: huffman@44289: notation suminf (binder "\" 10) nipkow@15546: paulson@14416: paulson@32877: lemma [trans]: "f=g ==> g sums z ==> f sums z" paulson@32877: by simp paulson@32877: 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.. summable f" hoelzl@41970: by (simp add: sums_def summable_def, blast) paulson@14416: hoelzl@41970: lemma summable_sums: wenzelm@46904: fixes f :: "nat \ 'a::{t2_space, comm_monoid_add}" wenzelm@46904: assumes "summable f" wenzelm@46904: shows "f sums (suminf f)" hoelzl@41970: proof - wenzelm@46904: from assms obtain s where s: "(\n. setsum f {0.. s" wenzelm@46904: unfolding summable_def sums_def [abs_def] .. wenzelm@46904: then show ?thesis unfolding sums_def [abs_def] suminf_def hoelzl@41970: by (rule theI, auto intro!: tendsto_unique[OF trivial_limit_sequentially]) hoelzl@41970: qed paulson@14416: hoelzl@41970: lemma summable_sumr_LIMSEQ_suminf: hoelzl@41970: fixes f :: "nat \ 'a::{t2_space, comm_monoid_add}" hoelzl@41970: shows "summable f \ (\n. setsum f {0.. suminf f" huffman@20688: by (rule summable_sums [unfolded sums_def]) paulson@14416: paulson@32707: lemma suminf_eq_lim: "suminf f = lim (%n. setsum f {0.. 'a::{t2_space, comm_monoid_add}" hoelzl@41970: shows "f sums s \ (s = suminf f)" hoelzl@41970: apply (frule sums_summable[THEN summable_sums]) hoelzl@41970: apply (auto intro!: tendsto_unique[OF trivial_limit_sequentially] simp add: sums_def) paulson@14416: done paulson@14416: hoelzl@41970: lemma sums_iff: hoelzl@41970: fixes f :: "nat \ 'a::{t2_space, comm_monoid_add}" hoelzl@41970: shows "f sums x \ summable f \ (suminf f = x)" paulson@32707: by (metis summable_sums sums_summable sums_unique) paulson@32707: hoelzl@47761: lemma sums_finite: hoelzl@47761: assumes [simp]: "finite N" hoelzl@47761: assumes f: "\n. n \ N \ f n = 0" hoelzl@47761: shows "f sums (\n\N. f n)" hoelzl@47761: proof - hoelzl@47761: { fix n hoelzl@47761: have "setsum f {..x. 0)" by auto hoelzl@47761: then show ?thesis by simp hoelzl@47761: next hoelzl@47761: assume [simp]: "N \ {}" hoelzl@47761: show ?thesis hoelzl@47761: proof (safe intro!: setsum_mono_zero_right f) hoelzl@47761: fix i assume "i \ N" hoelzl@47761: then have "i \ Max N" by simp hoelzl@47761: then show "i < n + Suc (Max N)" by simp hoelzl@47761: qed hoelzl@47761: qed } hoelzl@47761: note eq = this hoelzl@47761: show ?thesis unfolding sums_def hoelzl@47761: by (rule LIMSEQ_offset[of _ "Suc (Max N)"]) hoelzl@47761: (simp add: eq atLeast0LessThan tendsto_const del: add_Suc_right) hoelzl@47761: qed hoelzl@47761: hoelzl@47761: lemma suminf_finite: hoelzl@47761: fixes f :: "nat \ 'a::{comm_monoid_add,t2_space}" hoelzl@47761: assumes N: "finite N" and f: "\n. n \ N \ f n = 0" hoelzl@47761: shows "suminf f = (\n\N. f n)" hoelzl@47761: using sums_finite[OF assms, THEN sums_unique] by simp hoelzl@47761: hoelzl@47761: lemma sums_If_finite_set: hoelzl@47761: "finite A \ (\r. if r \ A then f r else 0 :: 'a::{comm_monoid_add,t2_space}) sums (\r\A. f r)" hoelzl@47761: using sums_finite[of A "(\r. if r \ A then f r else 0)"] by simp hoelzl@47761: hoelzl@47761: lemma sums_If_finite: hoelzl@47761: "finite {r. P r} \ (\r. if P r then f r else 0 :: 'a::{comm_monoid_add,t2_space}) sums (\r | P r. f r)" hoelzl@47761: using sums_If_finite_set[of "{r. P r}" f] by simp hoelzl@47761: hoelzl@47761: lemma sums_single: hoelzl@47761: "(\r. if r = i then f r else 0::'a::{comm_monoid_add,t2_space}) sums f i" hoelzl@47761: using sums_If_finite[of "\r. r = i" f] by simp hoelzl@47761: hoelzl@41970: lemma sums_split_initial_segment: hoelzl@41970: fixes f :: "nat \ 'a::real_normed_vector" hoelzl@41970: shows "f sums s ==> (\n. f(n + k)) sums (s - (SUM i = 0..< k. f i))" hoelzl@41970: apply (unfold sums_def) hoelzl@41970: apply (simp add: sumr_offset) huffman@44710: apply (rule tendsto_diff [OF _ tendsto_const]) avigad@16819: apply (rule LIMSEQ_ignore_initial_segment) avigad@16819: apply assumption avigad@16819: done avigad@16819: hoelzl@41970: lemma summable_ignore_initial_segment: hoelzl@41970: fixes f :: "nat \ 'a::real_normed_vector" hoelzl@41970: shows "summable f ==> 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: hoelzl@41970: lemma suminf_minus_initial_segment: hoelzl@41970: fixes f :: "nat \ 'a::real_normed_vector" hoelzl@41970: shows "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: hoelzl@41970: lemma suminf_split_initial_segment: hoelzl@41970: fixes f :: "nat \ 'a::real_normed_vector" hoelzl@41970: shows "summable f ==> hoelzl@41970: suminf f = (SUM i = 0..< k. f i) + (\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.. 'a::real_normed_vector" hoelzl@41970: assumes sumSuc: "(\ 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 . huffman@44710: from tendsto_add[OF this tendsto_const, 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: hoelzl@41970: lemma series_zero: hoelzl@41970: fixes f :: "nat \ 'a::{t2_space, comm_monoid_add}" hoelzl@41970: assumes "\m. n \ m \ f m = 0" hoelzl@41970: shows "f sums (setsum f {0..n. 0) sums 0" huffman@44568: unfolding sums_def by (simp add: tendsto_const) nipkow@15539: hoelzl@41970: lemma summable_zero[simp, intro]: "summable (\n. 0)" huffman@23121: by (rule sums_zero [THEN sums_summable]) avigad@16819: hoelzl@41970: lemma suminf_zero[simp]: "suminf (\n. 0::'a::{t2_space, comm_monoid_add}) = 0" huffman@23121: by (rule sums_zero [THEN sums_unique, symmetric]) hoelzl@41970: huffman@23119: lemma (in bounded_linear) sums: huffman@23119: "(\n. X n) sums a \ (\n. f (X n)) sums (f a)" huffman@44568: unfolding sums_def by (drule tendsto, 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@44282: lemmas sums_of_real = bounded_linear.sums [OF bounded_linear_of_real] huffman@44282: lemmas summable_of_real = bounded_linear.summable [OF bounded_linear_of_real] huffman@44282: lemmas suminf_of_real = bounded_linear.suminf [OF bounded_linear_of_real] huffman@44282: 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@44282: by (rule bounded_linear.sums [OF bounded_linear_mult_right]) 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@44282: by (rule bounded_linear.summable [OF bounded_linear_mult_right]) avigad@16819: huffman@20692: lemma suminf_mult: huffman@20692: fixes c :: "'a::real_normed_algebra" hoelzl@41970: shows "summable f \ suminf (\n. c * f n) = c * suminf f" huffman@44282: by (rule bounded_linear.suminf [OF bounded_linear_mult_right, 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@44282: by (rule bounded_linear.sums [OF bounded_linear_mult_left]) 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@44282: by (rule bounded_linear.summable [OF bounded_linear_mult_left]) 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@44282: by (rule bounded_linear.suminf [OF bounded_linear_mult_left]) 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@44282: by (rule bounded_linear.sums [OF bounded_linear_divide]) 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@44282: by (rule bounded_linear.summable [OF bounded_linear_divide]) 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@44282: by (rule bounded_linear.suminf [OF bounded_linear_divide, symmetric]) avigad@16819: hoelzl@41970: lemma sums_add: hoelzl@41970: fixes a b :: "'a::real_normed_field" hoelzl@41970: shows "\X sums a; Y sums b\ \ (\n. X n + Y n) sums (a + b)" huffman@44568: unfolding sums_def by (simp add: setsum_addf tendsto_add) avigad@16819: hoelzl@41970: lemma summable_add: hoelzl@41970: fixes X Y :: "nat \ 'a::real_normed_field" hoelzl@41970: shows "\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: hoelzl@41970: fixes X Y :: "nat \ 'a::real_normed_field" hoelzl@41970: shows "\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: hoelzl@41970: lemma sums_diff: hoelzl@41970: fixes X Y :: "nat \ 'a::real_normed_field" hoelzl@41970: shows "\X sums a; Y sums b\ \ (\n. X n - Y n) sums (a - b)" huffman@44568: unfolding sums_def by (simp add: setsum_subtractf tendsto_diff) huffman@23121: hoelzl@41970: lemma summable_diff: hoelzl@41970: fixes X Y :: "nat \ 'a::real_normed_field" hoelzl@41970: shows "\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: hoelzl@41970: fixes X Y :: "nat \ 'a::real_normed_field" hoelzl@41970: shows "\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: hoelzl@41970: lemma sums_minus: hoelzl@41970: fixes X :: "nat \ 'a::real_normed_field" hoelzl@41970: shows "X sums a ==> (\n. - X n) sums (- a)" huffman@44568: unfolding sums_def by (simp add: setsum_negf tendsto_minus) avigad@16819: hoelzl@41970: lemma summable_minus: hoelzl@41970: fixes X :: "nat \ 'a::real_normed_field" hoelzl@41970: shows "summable X \ summable (\n. - X n)" huffman@23121: unfolding summable_def by (auto intro: sums_minus) avigad@16819: hoelzl@41970: lemma suminf_minus: hoelzl@41970: fixes X :: "nat \ 'a::real_normed_field" hoelzl@41970: shows "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: hoelzl@41970: fixes f :: "nat \ 'a::real_normed_field" huffman@44727: shows "\f sums s; 0 < k\ \ (\n. setsum f {n*k.. real" paulson@33271: assumes pos: "!!n. 0 \ f n" and le: "!!n. setsum f {0.. x" paulson@33271: shows "summable f" paulson@33271: proof - hoelzl@41970: have "convergent (\n. setsum f {0..n. setsum f {0..n. setsum f {0..n. x"]) hoelzl@41970: (auto simp add: le pos) hoelzl@41970: next paulson@33271: show "\m n. m \ n \ setsum f {0.. setsum f {0.. L" paulson@33271: by (blast dest: convergentD) paulson@33271: thus ?thesis hoelzl@41970: by (force simp add: summable_def sums_def) paulson@33271: qed paulson@33271: huffman@20692: lemma series_pos_le: huffman@20692: fixes f :: "nat \ 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) huffman@44568: 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@44568: using neq_0 by (intro tendsto_intros) 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: haftmann@31017: fixes x :: "'a::{real_normed_field}" huffman@20692: shows "norm x < 1 \ summable (\n. x ^ n)" huffman@20692: by (rule geometric_sums [THEN sums_summable]) paulson@14416: huffman@47108: lemma half: "0 < 1 / (2::'a::linordered_field)" huffman@47108: by simp paulson@33271: paulson@33271: lemma power_half_series: "(\n. (1/2::real)^Suc n) sums 1" paulson@33271: proof - paulson@33271: have 2: "(\n. (1/2::real)^n) sums 2" using geometric_sums [of "1/2::real"] paulson@33271: by auto paulson@33271: have "(\n. (1/2::real)^Suc n) = (\n. (1 / 2) ^ n / 2)" paulson@33271: by simp huffman@44282: thus ?thesis using sums_divide [OF 2, of 2] paulson@33271: by simp paulson@33271: qed paulson@33271: 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.. 'a::real_normed_vector" hoelzl@41970: shows "summable f \ f ----> 0" huffman@20689: apply (drule summable_convergent_sumr_iff [THEN iffD1]) huffman@20692: apply (drule convergent_Cauchy) huffman@31336: apply (simp only: Cauchy_iff LIMSEQ_iff, 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@32707: lemma suminf_le: paulson@32707: fixes x :: real paulson@32707: shows "summable f \ (!!n. setsum f {0.. x) \ suminf f \ x" hoelzl@41970: by (simp add: summable_convergent_sumr_iff suminf_eq_lim lim_le) paulson@32707: paulson@14416: lemma summable_Cauchy: hoelzl@41970: "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: haftmann@31017: fixes x :: "'a::{real_normed_algebra_1,banach}" 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) huffman@44289: then show "0 \ suminf f" by simp hoelzl@41970: 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@44568: by (auto intro: LIMSEQ_le tendsto_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) huffman@44710: apply(simp cong del: setsum_cong 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) hoelzl@41970: 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) huffman@20848: apply (rule_tac x = "norm (f N) * (1/ (1 - c)) / (c ^ N)" in exI) hoelzl@41970: 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@44568: by (intro tendsto_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@44568: using a b by (intro tendsto_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@36657: have "Zfun (\n. setsum ?f (?S1 n - ?S2 n)) sequentially" huffman@36657: proof (rule ZfunI, simp only: eventually_sequentially 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@36657: hence "Zfun (\n. setsum ?g (?S1 n - ?S2 n)) sequentially" huffman@36657: apply (rule Zfun_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@36660: unfolding tendsto_Zfun_iff diff_0_right huffman@36657: by (simp only: setsum_diff finite_S1 S2_le_S1) 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