# HG changeset patch # User paulson # Date 1530625574 -3600 # Node ID 1657b9a5dd5d3dd459b0aa6409ed4a4c481d8fdc # Parent ec4fe1032b6e03205a7a6ad1a9c7027388486d22 more on infinite products diff -r ec4fe1032b6e -r 1657b9a5dd5d src/HOL/Analysis/Complex_Transcendental.thy --- a/src/HOL/Analysis/Complex_Transcendental.thy Tue Jul 03 10:07:35 2018 +0100 +++ b/src/HOL/Analysis/Complex_Transcendental.thy Tue Jul 03 14:46:14 2018 +0100 @@ -278,6 +278,84 @@ by (auto simp: norm_mult) qed +lemma cmod_add_squared: + fixes r1 r2::real + assumes "r1 \ 0" "r2 \ 0" + shows "(cmod (r1 * exp (\ * \1) + r2 * exp (\ * \2)))\<^sup>2 = r1\<^sup>2 + r2\<^sup>2 + 2 * r1 * r2 * cos (\1 - \2)" (is "(cmod (?z1 + ?z2))\<^sup>2 = ?rhs") +proof - + have "(cmod (?z1 + ?z2))\<^sup>2 = (?z1 + ?z2) * cnj (?z1 + ?z2)" + by (rule complex_norm_square) + also have "\ = (?z1 * cnj ?z1 + ?z2 * cnj ?z2) + (?z1 * cnj ?z2 + cnj ?z1 * ?z2)" + by (simp add: algebra_simps) + also have "\ = (norm ?z1)\<^sup>2 + (norm ?z2)\<^sup>2 + 2 * Re (?z1 * cnj ?z2)" + unfolding complex_norm_square [symmetric] cnj_add_mult_eq_Re by simp + also have "\ = ?rhs" + by (simp add: norm_mult) (simp add: exp_Euler complex_is_Real_iff [THEN iffD1] cos_diff algebra_simps) + finally show ?thesis + using of_real_eq_iff by blast +qed + +lemma cmod_diff_squared: + fixes r1 r2::real + assumes "r1 \ 0" "r2 \ 0" + shows "(cmod (r1 * exp (\ * \1) - r2 * exp (\ * \2)))\<^sup>2 = r1\<^sup>2 + r2\<^sup>2 - 2*r1*r2*cos (\1 - \2)" (is "(cmod (?z1 - ?z2))\<^sup>2 = ?rhs") +proof - + have "exp (\ * (\2 + pi)) = - exp (\ * \2)" + by (simp add: exp_Euler cos_plus_pi sin_plus_pi) + then have "(cmod (?z1 - ?z2))\<^sup>2 = cmod (?z1 + r2 * exp (\ * (\2 + pi))) ^2" + by simp + also have "\ = r1\<^sup>2 + r2\<^sup>2 + 2*r1*r2*cos (\1 - (\2 + pi))" + using assms cmod_add_squared by blast + also have "\ = ?rhs" + by (simp add: add.commute diff_add_eq_diff_diff_swap) + finally show ?thesis . +qed + +lemma polar_convergence: + fixes R::real + assumes "\j. r j > 0" "R > 0" + shows "((\j. r j * exp (\ * \ j)) \ (R * exp (\ * \))) \ + (r \ R) \ (\k. (\j. \ j - of_int (k j) * (2 * pi)) \ \)" (is "(?z \ ?Z) = ?rhs") +proof + assume L: "?z \ ?Z" + have rR: "r \ R" + using tendsto_norm [OF L] assms by (auto simp: norm_mult abs_of_pos) + moreover obtain k where "(\j. \ j - of_int (k j) * (2 * pi)) \ \" + proof - + have "cos (\ j - \) = ((r j)\<^sup>2 + R\<^sup>2 - (norm(?z j - ?Z))\<^sup>2) / (2 * R * r j)" for j + apply (subst cmod_diff_squared) + using assms by (auto simp: divide_simps less_le) + moreover have "(\j. ((r j)\<^sup>2 + R\<^sup>2 - (norm(?z j - ?Z))\<^sup>2) / (2 * R * r j)) \ ((R\<^sup>2 + R\<^sup>2 - (norm(?Z - ?Z))\<^sup>2) / (2 * R * R))" + by (intro L rR tendsto_intros) (use \R > 0\ in force) + moreover have "((R\<^sup>2 + R\<^sup>2 - (norm(?Z - ?Z))\<^sup>2) / (2 * R * R)) = 1" + using \R > 0\ by (simp add: power2_eq_square divide_simps) + ultimately have "(\j. cos (\ j - \)) \ 1" + by auto + then show ?thesis + using that cos_diff_limit_1 by blast + qed + ultimately show ?rhs + by metis +next + assume R: ?rhs + show "?z \ ?Z" + proof (rule tendsto_mult) + show "(\x. complex_of_real (r x)) \ of_real R" + using R by (auto simp: tendsto_of_real_iff) + obtain k where "(\j. \ j - of_int (k j) * (2 * pi)) \ \" + using R by metis + then have "(\j. complex_of_real (\ j - of_int (k j) * (2 * pi))) \ of_real \" + using tendsto_of_real_iff by force + then have "(\j. exp (\ * of_real (\ j - of_int (k j) * (2 * pi)))) \ exp (\ * \)" + using tendsto_mult [OF tendsto_const] isCont_exp isCont_tendsto_compose by blast + moreover have "exp (\ * of_real (\ j - of_int (k j) * (2 * pi))) = exp (\ * \ j)" for j + unfolding exp_eq + by (rule_tac x="- k j" in exI) (auto simp: algebra_simps) + ultimately show "(\j. exp (\ * \ j)) \ exp (\ * \)" + by auto + qed +qed + lemma sin_cos_eq_iff: "sin y = sin x \ cos y = cos x \ (\n::int. y = x + 2 * pi * n)" proof - { assume "sin y = sin x" "cos y = cos x" diff -r ec4fe1032b6e -r 1657b9a5dd5d src/HOL/Analysis/Infinite_Products.thy --- a/src/HOL/Analysis/Infinite_Products.thy Tue Jul 03 10:07:35 2018 +0100 +++ b/src/HOL/Analysis/Infinite_Products.thy Tue Jul 03 14:46:14 2018 +0100 @@ -6,7 +6,7 @@ *) section \Infinite Products\ theory Infinite_Products - imports Topology_Euclidean_Space + imports Topology_Euclidean_Space Complex_Transcendental begin subsection\Preliminaries\ @@ -1430,6 +1430,56 @@ end +lemma convergent_prod_iff_summable_real: + fixes a :: "nat \ real" + assumes "\n. a n > 0" + shows "convergent_prod (\k. 1 + a k) \ summable a" (is "?lhs = ?rhs") +proof + assume ?lhs + then obtain p where "raw_has_prod (\k. 1 + a k) 0 p" + by (metis assms add_less_same_cancel2 convergent_prod_offset_0 not_one_less_zero) + then have to_p: "(\n. \k\n. 1 + a k) \ p" + by (auto simp: raw_has_prod_def) + moreover have le: "(\k\n. a k) \ (\k\n. 1 + a k)" for n + by (rule sum_le_prod) (use assms less_le in force) + have "(\k\n. 1 + a k) \ p" for n + proof (rule incseq_le [OF _ to_p]) + show "incseq (\n. \k\n. 1 + a k)" + using assms by (auto simp: mono_def order.strict_implies_order intro!: prod_mono2) + qed + with le have "(\k\n. a k) \ p" for n + by (metis order_trans) + with assms bounded_imp_summable show ?rhs + by (metis not_less order.asym) +next + assume R: ?rhs + have "(\k\n. 1 + a k) \ exp (suminf a)" for n + proof - + have "(\k\n. 1 + a k) \ exp (\k\n. a k)" for n + by (rule prod_le_exp_sum) (use assms less_le in force) + moreover have "exp (\k\n. a k) \ exp (suminf a)" for n + unfolding exp_le_cancel_iff + by (meson sum_le_suminf R assms finite_atMost less_eq_real_def) + ultimately show ?thesis + by (meson order_trans) + qed + then obtain L where L: "(\n. \k\n. 1 + a k) \ L" + by (metis assms bounded_imp_convergent_prod convergent_prod_iff_nz_lim le_add_same_cancel1 le_add_same_cancel2 less_le not_le zero_le_one) + moreover have "L \ 0" + proof + assume "L = 0" + with L have "(\n. \k\n. 1 + a k) \ 0" + by simp + moreover have "(\k\n. 1 + a k) > 1" for n + by (simp add: assms less_1_prod) + ultimately show False + by (meson Lim_bounded2 not_one_le_zero less_imp_le) + qed + ultimately show ?lhs + using assms convergent_prod_iff_nz_lim + by (metis add_less_same_cancel1 less_le not_le zero_less_one) +qed + lemma exp_suminf_prodinf_real: fixes f :: "nat \ real" assumes ge0:"\n. f n \ 0" and ac: "abs_convergent_prod (\n. exp (f n))" @@ -1506,6 +1556,159 @@ by (simp add: "0" f less_0_prodinf suminf_ln_real) +lemma Ln_prodinf_complex: + fixes z :: "nat \ complex" + assumes z: "\j. z j \ 0" and \: "\ \ 0" + shows "((\n. \j\n. z j) \ \) \ (\k. (\n. (\j\n. Ln (z j))) \ Ln \ + of_int k * (of_real(2*pi) * \))" (is "?lhs = ?rhs") +proof + assume L: ?lhs + have pnz: "(\j\n. z j) \ 0" for n + using z by auto + define \ where "\ \ Arg \ + 2*pi" + then have "\ > pi" + using Arg_def mpi_less_Im_Ln by fastforce + have \_eq: "\ = cmod \ * exp (\ * \)" + using Arg_def Arg_eq \ unfolding \_def by (simp add: algebra_simps exp_add) + define \ where "\ \ \n. THE t. is_Arg (\j\n. z j) t \ t \ {\-pi<..\+pi}" + have uniq: "\!s. is_Arg (\j\n. z j) s \ s \ {\-pi<..\+pi}" for n + using Argument_exists_unique [OF pnz] by metis + have \: "is_Arg (\j\n. z j) (\ n)" and \_interval: "\ n \ {\-pi<..\+pi}" for n + unfolding \_def + using theI' [OF uniq] by metis+ + have \_pos: "\j. \ j > 0" + using \_interval \\ > pi\ by simp (meson diff_gt_0_iff_gt less_trans) + have "(\j\n. z j) = cmod (\j\n. z j) * exp (\ * \ n)" for n + using \ by (auto simp: is_Arg_def) + then have eq: "(\n. \j\n. z j) = (\n. cmod (\j\n. z j) * exp (\ * \ n))" + by simp + then have "(\n. (cmod (\j\n. z j)) * exp (\ * (\ n))) \ \" + using L by force + then obtain k where k: "(\j. \ j - of_int (k j) * (2 * pi)) \ \" + using L by (subst (asm) \_eq) (auto simp add: eq z \ polar_convergence) + moreover have "\\<^sub>F n in sequentially. k n = 0" + proof - + have *: "kj = 0" if "dist (vj - real_of_int kj * 2) V < 1" "vj \ {V - 1<..V + 1}" for kj vj V + using that by (auto simp: dist_norm) + have "\\<^sub>F j in sequentially. dist (\ j - of_int (k j) * (2 * pi)) \ < pi" + using tendstoD [OF k] pi_gt_zero by blast + then show ?thesis + proof (rule eventually_mono) + fix j + assume d: "dist (\ j - real_of_int (k j) * (2 * pi)) \ < pi" + show "k j = 0" + by (rule * [of "\ j/pi" _ "\/pi"]) + (use \_interval [of j] d in \simp_all add: divide_simps dist_norm\) + qed + qed + ultimately have \to\: "\ \ \" + apply (simp only: tendsto_def) + apply (erule all_forward imp_forward asm_rl)+ + apply (drule (1) eventually_conj) + apply (auto elim: eventually_mono) + done + then have to0: "(\n. \\ (Suc n) - \ n\) \ 0" + by (metis (full_types) diff_self filterlim_sequentially_Suc tendsto_diff tendsto_rabs_zero) + have "\k. Im (\j\n. Ln (z j)) - of_int k * (2*pi) = \ n" for n + proof (rule is_Arg_exp_diff_2pi) + show "is_Arg (exp (\j\n. Ln (z j))) (\ n)" + using pnz \ by (simp add: is_Arg_def exp_sum prod_norm) + qed + then have "\k. (\j\n. Im (Ln (z j))) = \ n + of_int k * (2*pi)" for n + by (simp add: algebra_simps) + then obtain k where k: "\n. (\j\n. Im (Ln (z j))) = \ n + of_int (k n) * (2*pi)" + by metis + obtain K where "\\<^sub>F n in sequentially. k n = K" + proof - + have k_le: "(2*pi) * \k (Suc n) - k n\ \ \\ (Suc n) - \ n\ + \Im (Ln (z (Suc n)))\" for n + proof - + have "(\j\Suc n. Im (Ln (z j))) - (\j\n. Im (Ln (z j))) = Im (Ln (z (Suc n)))" + by simp + then show ?thesis + using k [of "Suc n"] k [of n] by (auto simp: abs_if algebra_simps) + qed + have "z \ 1" + using L \ convergent_prod_iff_nz_lim z by (blast intro: convergent_prod_imp_LIMSEQ) + with z have "(\n. Ln (z n)) \ Ln 1" + using isCont_tendsto_compose [OF continuous_at_Ln] nonpos_Reals_one_I by blast + then have "(\n. Ln (z n)) \ 0" + by simp + then have "(\n. \Im (Ln (z (Suc n)))\) \ 0" + by (metis LIMSEQ_unique \z \ 1\ continuous_at_Ln filterlim_sequentially_Suc isCont_tendsto_compose nonpos_Reals_one_I tendsto_Im tendsto_rabs_zero_iff zero_complex.simps(2)) + then have "\\<^sub>F n in sequentially. \Im (Ln (z (Suc n)))\ < 1" + by (simp add: order_tendsto_iff) + moreover have "\\<^sub>F n in sequentially. \\ (Suc n) - \ n\ < 1" + using to0 by (simp add: order_tendsto_iff) + ultimately have "\\<^sub>F n in sequentially. (2*pi) * \k (Suc n) - k n\ < 1 + 1" + proof (rule eventually_elim2) + fix n + assume "\Im (Ln (z (Suc n)))\ < 1" and "\\ (Suc n) - \ n\ < 1" + with k_le [of n] show "2 * pi * real_of_int \k (Suc n) - k n\ < 1 + 1" + by linarith + qed + then have "\\<^sub>F n in sequentially. real_of_int\k (Suc n) - k n\ < 1" + proof (rule eventually_mono) + fix n :: "nat" + assume "2 * pi * \k (Suc n) - k n\ < 1 + 1" + then have "\k (Suc n) - k n\ < 2 / (2*pi)" + by (simp add: field_simps) + also have "... < 1" + using pi_ge_two by auto + finally show "real_of_int \k (Suc n) - k n\ < 1" . + qed + then obtain N where N: "\n. n\N \ \k (Suc n) - k n\ = 0" + using eventually_sequentially less_irrefl of_int_abs by fastforce + have "k (N+i) = k N" for i + proof (induction i) + case (Suc i) + with N [of "N+i"] show ?case + by auto + qed simp + then have "\n. n\N \ k n = k N" + using le_Suc_ex by auto + then show ?thesis + by (force simp add: eventually_sequentially intro: that) + qed + with \to\ have "(\n. (\j\n. Im (Ln (z j)))) \ \ + of_int K * (2*pi)" + by (simp add: k tendsto_add tendsto_mult Lim_eventually) + moreover have "(\n. (\k\n. Re (Ln (z k)))) \ Re (Ln \)" + using assms continuous_imp_tendsto [OF isCont_ln tendsto_norm [OF L]] + by (simp add: o_def flip: prod_norm ln_prod) + ultimately show ?rhs + by (rule_tac x="K+1" in exI) (auto simp: tendsto_complex_iff \_def Arg_def assms algebra_simps) +next + assume ?rhs + then obtain r where r: "(\n. (\k\n. Ln (z k))) \ Ln \ + of_int r * (of_real(2*pi) * \)" .. + have "(\n. exp (\k\n. Ln (z k))) \ \" + using assms continuous_imp_tendsto [OF isCont_exp r] exp_integer_2pi [of r] + by (simp add: o_def exp_add algebra_simps) + moreover have "exp (\k\n. Ln (z k)) = (\k\n. z k)" for n + by (simp add: exp_sum add_eq_0_iff assms) + ultimately show ?lhs + by auto +qed + +text\Prop 17.2 of Bak and Newman, Complex Analysis, p.242\ +proposition convergent_prod_iff_summable_complex: + fixes z :: "nat \ complex" + assumes "\k. z k \ 0" + shows "convergent_prod (\k. z k) \ summable (\k. Ln (z k))" (is "?lhs = ?rhs") +proof + assume ?lhs + then obtain p where p: "(\n. \k\n. z k) \ p" and "p \ 0" + using convergent_prod_LIMSEQ prodinf_nonzero add_eq_0_iff assms by fastforce + then show ?rhs + using Ln_prodinf_complex assms + by (auto simp: prodinf_nonzero summable_def sums_def_le) +next + assume R: ?rhs + have "(\k\n. z k) = exp (\k\n. Ln (z k))" for n + by (simp add: exp_sum add_eq_0_iff assms) + then have "(\n. \k\n. z k) \ exp (suminf (\k. Ln (z k)))" + using continuous_imp_tendsto [OF isCont_exp summable_LIMSEQ' [OF R]] by (simp add: o_def) + then show ?lhs + by (subst convergent_prod_iff_convergent) (auto simp: convergent_def tendsto_Lim assms add_eq_0_iff) +qed + subsection\Embeddings from the reals into some complete real normed field\ lemma tendsto_eq_of_real_lim: