199 assume ?lhs then show ?rhs |
199 assume ?lhs then show ?rhs |
200 using assms convergentD convergent_prod_imp_convergent convergent_prod_to_zero_iff by blast |
200 using assms convergentD convergent_prod_imp_convergent convergent_prod_to_zero_iff by blast |
201 next |
201 next |
202 assume ?rhs then show ?lhs |
202 assume ?rhs then show ?lhs |
203 unfolding prod_defs |
203 unfolding prod_defs |
204 by (rule_tac x="0" in exI) (auto simp: ) |
204 by (rule_tac x=0 in exI) auto |
205 qed |
205 qed |
206 |
206 |
207 lemma convergent_prod_iff_convergent: |
207 lemma convergent_prod_iff_convergent: |
208 fixes f :: "nat \<Rightarrow> 'a :: {topological_semigroup_mult,t2_space,idom}" |
208 fixes f :: "nat \<Rightarrow> 'a :: {topological_semigroup_mult,t2_space,idom}" |
209 assumes "\<And>i. f i \<noteq> 0" |
209 assumes "\<And>i. f i \<noteq> 0" |
210 shows "convergent_prod f \<longleftrightarrow> convergent (\<lambda>n. \<Prod>i\<le>n. f i) \<and> lim (\<lambda>n. \<Prod>i\<le>n. f i) \<noteq> 0" |
210 shows "convergent_prod f \<longleftrightarrow> convergent (\<lambda>n. \<Prod>i\<le>n. f i) \<and> lim (\<lambda>n. \<Prod>i\<le>n. f i) \<noteq> 0" |
211 by (force simp add: convergent_prod_iff_nz_lim assms convergent_def limI) |
211 by (force simp: convergent_prod_iff_nz_lim assms convergent_def limI) |
212 |
212 |
213 |
213 |
214 lemma abs_convergent_prod_altdef: |
214 lemma abs_convergent_prod_altdef: |
215 fixes f :: "nat \<Rightarrow> 'a :: {one,real_normed_vector}" |
215 fixes f :: "nat \<Rightarrow> 'a :: {one,real_normed_vector}" |
216 shows "abs_convergent_prod f \<longleftrightarrow> convergent (\<lambda>n. \<Prod>i\<le>n. 1 + norm (f i - 1))" |
216 shows "abs_convergent_prod f \<longleftrightarrow> convergent (\<lambda>n. \<Prod>i\<le>n. 1 + norm (f i - 1))" |
564 proof - |
564 proof - |
565 have "{..n+M} = {..<M} \<union> {M..n+M}" |
565 have "{..n+M} = {..<M} \<union> {M..n+M}" |
566 by auto |
566 by auto |
567 then have "prod f {..n+M} = prod f {..<M} * prod f {M..n+M}" |
567 then have "prod f {..n+M} = prod f {..<M} * prod f {M..n+M}" |
568 by simp (subst prod.union_disjoint; force) |
568 by simp (subst prod.union_disjoint; force) |
569 also have "... = prod f {..<M} * (\<Prod>i\<le>n. f (i + M))" |
569 also have "\<dots> = prod f {..<M} * (\<Prod>i\<le>n. f (i + M))" |
570 by (metis (mono_tags, lifting) add.left_neutral atMost_atLeast0 prod_shift_bounds_cl_nat_ivl) |
570 by (metis (mono_tags, lifting) add.left_neutral atMost_atLeast0 prod_shift_bounds_cl_nat_ivl) |
571 finally show ?thesis by metis |
571 finally show ?thesis by metis |
572 qed |
572 qed |
573 ultimately have "(\<lambda>n. prod f {..n}) \<longlonglongrightarrow> prod f {..<M} * p" |
573 ultimately have "(\<lambda>n. prod f {..n}) \<longlonglongrightarrow> prod f {..<M} * p" |
574 by (auto intro: LIMSEQ_offset [where k=M]) |
574 by (auto intro: LIMSEQ_offset [where k=M]) |
614 using eventually_ge_at_top[of N] |
614 using eventually_ge_at_top[of N] |
615 proof eventually_elim |
615 proof eventually_elim |
616 case (elim n) |
616 case (elim n) |
617 then have "{..n} = {..<N} \<union> {N..n}" |
617 then have "{..n} = {..<N} \<union> {N..n}" |
618 by auto |
618 by auto |
619 also have "prod f ... = prod f {..<N} * prod f {N..n}" |
619 also have "prod f \<dots> = prod f {..<N} * prod f {N..n}" |
620 by (intro prod.union_disjoint) auto |
620 by (intro prod.union_disjoint) auto |
621 also from N have "prod f {N..n} = prod g {N..n}" |
621 also from N have "prod f {N..n} = prod g {N..n}" |
622 by (intro prod.cong) simp_all |
622 by (intro prod.cong) simp_all |
623 also have "prod f {..<N} * prod g {N..n} = C * (prod g {..<N} * prod g {N..n})" |
623 also have "prod f {..<N} * prod g {N..n} = C * (prod g {..<N} * prod g {N..n})" |
624 unfolding C_def by (simp add: g prod_dividef) |
624 unfolding C_def by (simp add: g prod_dividef) |
654 shows "f has_prod (\<Prod>n\<in>N. f n)" |
654 shows "f has_prod (\<Prod>n\<in>N. f n)" |
655 proof - |
655 proof - |
656 have eq: "prod f {..n + Suc (Max N)} = prod f N" for n |
656 have eq: "prod f {..n + Suc (Max N)} = prod f N" for n |
657 proof (rule prod.mono_neutral_right) |
657 proof (rule prod.mono_neutral_right) |
658 show "N \<subseteq> {..n + Suc (Max N)}" |
658 show "N \<subseteq> {..n + Suc (Max N)}" |
659 by (auto simp add: le_Suc_eq trans_le_add2) |
659 by (auto simp: le_Suc_eq trans_le_add2) |
660 show "\<forall>i\<in>{..n + Suc (Max N)} - N. f i = 1" |
660 show "\<forall>i\<in>{..n + Suc (Max N)} - N. f i = 1" |
661 using f by blast |
661 using f by blast |
662 qed auto |
662 qed auto |
663 show ?thesis |
663 show ?thesis |
664 proof (cases "\<forall>n\<in>N. f n \<noteq> 0") |
664 proof (cases "\<forall>n\<in>N. f n \<noteq> 0") |
685 have "(\<Prod>i\<le>n + Max N. f (Suc (i + Max ?Z))) = prod f {Suc (Max ?Z)..n + Max N + Suc (Max ?Z)}" |
685 have "(\<Prod>i\<le>n + Max N. f (Suc (i + Max ?Z))) = prod f {Suc (Max ?Z)..n + Max N + Suc (Max ?Z)}" |
686 proof (rule prod.reindex_cong [where l = "\<lambda>i. i + Suc (Max ?Z)", THEN sym]) |
686 proof (rule prod.reindex_cong [where l = "\<lambda>i. i + Suc (Max ?Z)", THEN sym]) |
687 show "{Suc (Max ?Z)..n + Max N + Suc (Max ?Z)} = (\<lambda>i. i + Suc (Max ?Z)) ` {..n + Max N}" |
687 show "{Suc (Max ?Z)..n + Max N + Suc (Max ?Z)} = (\<lambda>i. i + Suc (Max ?Z)) ` {..n + Max N}" |
688 using le_Suc_ex by fastforce |
688 using le_Suc_ex by fastforce |
689 qed (auto simp: inj_on_def) |
689 qed (auto simp: inj_on_def) |
690 also have "... = ?q" |
690 also have "\<dots> = ?q" |
691 by (rule prod.mono_neutral_right) |
691 by (rule prod.mono_neutral_right) |
692 (use Max.coboundedI [OF \<open>finite N\<close>] f in \<open>force+\<close>) |
692 (use Max.coboundedI [OF \<open>finite N\<close>] f in \<open>force+\<close>) |
693 finally show ?thesis . |
693 finally show ?thesis . |
694 qed |
694 qed |
695 have q: "gen_has_prod f (Suc (Max ?Z)) ?q" |
695 have q: "gen_has_prod f (Suc (Max ?Z)) ?q" |