src/HOL/Analysis/Infinite_Products.thy
changeset 68138 c738f40e88d4
parent 68136 f022083489d0
child 68361 20375f232f3b
equal deleted inserted replaced
68137:afcdc4c0ef0d 68138:c738f40e88d4
   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"