| author | wenzelm | 
| Mon, 04 Dec 2023 12:10:39 +0100 | |
| changeset 79120 | 45b2171e9e03 | 
| parent 78751 | 80b4f6a0808d | 
| child 79945 | ca004ccf2352 | 
| permissions | -rw-r--r-- | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1 | theory Laurent_Convergence | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2 | imports "HOL-Computational_Algebra.Formal_Laurent_Series" "HOL-Library.Landau_Symbols" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 3 | Residue_Theorem | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 4 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 5 | begin | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 6 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 7 | instance fps :: (semiring_char_0) semiring_char_0 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 8 | proof | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 9 | show "inj (of_nat :: nat \<Rightarrow> 'a fps)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 10 | proof | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 11 | fix m n :: nat | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 12 | assume "of_nat m = (of_nat n :: 'a fps)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 13 | hence "fps_nth (of_nat m) 0 = (fps_nth (of_nat n) 0 :: 'a)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 14 | by (simp only: ) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 15 | thus "m = n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 16 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 17 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 18 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 19 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 20 | instance fls :: (semiring_char_0) semiring_char_0 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 21 | proof | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 22 | show "inj (of_nat :: nat \<Rightarrow> 'a fls)" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 23 | by (metis fls_regpart_of_nat injI of_nat_eq_iff) | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 24 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 25 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 26 | lemma fls_const_eq_0_iff [simp]: "fls_const c = 0 \<longleftrightarrow> c = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 27 | using fls_const_0 fls_const_nonzero by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 28 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 29 | lemma fls_subdegree_add_eq1: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 30 | assumes "f \<noteq> 0" "fls_subdegree f < fls_subdegree g" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 31 | shows "fls_subdegree (f + g) = fls_subdegree f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 32 | proof (intro antisym) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 33 | from assms have *: "fls_nth (f + g) (fls_subdegree f) \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 34 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 35 | from * show "fls_subdegree (f + g) \<le> fls_subdegree f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 36 | by (rule fls_subdegree_leI) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 37 | from * have "f + g \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 38 | using fls_nonzeroI by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 39 | thus "fls_subdegree f \<le> fls_subdegree (f + g)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 40 | using assms(2) fls_plus_subdegree by force | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 41 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 42 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 43 | lemma fls_subdegree_add_eq2: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 44 | assumes "g \<noteq> 0" "fls_subdegree g < fls_subdegree f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 45 | shows "fls_subdegree (f + g) = fls_subdegree g" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 46 | proof (intro antisym) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 47 | from assms have *: "fls_nth (f + g) (fls_subdegree g) \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 48 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 49 | from * show "fls_subdegree (f + g) \<le> fls_subdegree g" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 50 | by (rule fls_subdegree_leI) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 51 | from * have "f + g \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 52 | using fls_nonzeroI by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 53 | thus "fls_subdegree g \<le> fls_subdegree (f + g)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 54 | using assms(2) fls_plus_subdegree by force | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 55 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 56 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 57 | lemma fls_subdegree_diff_eq1: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 58 | assumes "f \<noteq> 0" "fls_subdegree f < fls_subdegree g" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 59 | shows "fls_subdegree (f - g) = fls_subdegree f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 60 | using fls_subdegree_add_eq1[of f "-g"] assms by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 61 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 62 | lemma fls_subdegree_diff_eq2: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 63 | assumes "g \<noteq> 0" "fls_subdegree g < fls_subdegree f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 64 | shows "fls_subdegree (f - g) = fls_subdegree g" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 65 | using fls_subdegree_add_eq2[of "-g" f] assms by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 66 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 67 | lemma nat_minus_fls_subdegree_plus_const_eq: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 68 | "nat (-fls_subdegree (F + fls_const c)) = nat (-fls_subdegree F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 69 | proof (cases "fls_subdegree F < 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 70 | case True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 71 | hence "fls_subdegree (F + fls_const c) = fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 72 | by (intro fls_subdegree_add_eq1) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 73 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 74 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 75 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 76 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 77 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 78 | by (auto simp: fls_subdegree_ge0I) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 79 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 80 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 81 | lemma at_to_0': "NO_MATCH 0 z \<Longrightarrow> at z = filtermap (\<lambda>x. x + z) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 82 | for z :: "'a::real_normed_vector" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 83 | by (rule at_to_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 84 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 85 | lemma nhds_to_0: "nhds (x :: 'a :: real_normed_vector) = filtermap ((+) x) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 86 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 87 | have "(\<lambda>xa. xa - - x) = (+) x" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 88 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 89 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 90 | using filtermap_nhds_shift[of "-x" 0] by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 91 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 92 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 93 | lemma nhds_to_0': "NO_MATCH 0 x \<Longrightarrow> nhds (x :: 'a :: real_normed_vector) = filtermap ((+) x) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 94 | by (rule nhds_to_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 95 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 96 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 97 | definition%important fls_conv_radius :: "complex fls \<Rightarrow> ereal" where | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 98 | "fls_conv_radius f = fps_conv_radius (fls_regpart f)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 99 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 100 | definition%important eval_fls :: "complex fls \<Rightarrow> complex \<Rightarrow> complex" where | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 101 | "eval_fls F z = eval_fps (fls_base_factor_to_fps F) z * z powi fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 102 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 103 | definition\<^marker>\<open>tag important\<close> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 104 | has_laurent_expansion :: "(complex \<Rightarrow> complex) \<Rightarrow> complex fls \<Rightarrow> bool" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 105 | (infixl "has'_laurent'_expansion" 60) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 106 | where "(f has_laurent_expansion F) \<longleftrightarrow> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 107 | fls_conv_radius F > 0 \<and> eventually (\<lambda>z. eval_fls F z = f z) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 108 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 109 | lemma has_laurent_expansion_schematicI: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 110 | "f has_laurent_expansion F \<Longrightarrow> F = G \<Longrightarrow> f has_laurent_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 111 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 112 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 113 | lemma has_laurent_expansion_cong: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 114 | assumes "eventually (\<lambda>x. f x = g x) (at 0)" "F = G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 115 | shows "(f has_laurent_expansion F) \<longleftrightarrow> (g has_laurent_expansion G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 116 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 117 | have "eventually (\<lambda>z. eval_fls F z = g z) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 118 | if "eventually (\<lambda>z. eval_fls F z = f z) (at 0)" "eventually (\<lambda>x. f x = g x) (at 0)" for f g | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 119 | using that by eventually_elim auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 120 | from this[of f g] this[of g f] show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 121 | using assms by (auto simp: eq_commute has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 122 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 123 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 124 | lemma has_laurent_expansion_cong': | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 125 | assumes "eventually (\<lambda>x. f x = g x) (at z)" "F = G" "z = z'" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 126 | shows "((\<lambda>x. f (z + x)) has_laurent_expansion F) \<longleftrightarrow> ((\<lambda>x. g (z' + x)) has_laurent_expansion G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 127 | by (intro has_laurent_expansion_cong) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 128 | (use assms in \<open>auto simp: at_to_0' eventually_filtermap add_ac\<close>) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 129 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 130 | lemma fls_conv_radius_altdef: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 131 | "fls_conv_radius F = fps_conv_radius (fls_base_factor_to_fps F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 132 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 133 | have "conv_radius (\<lambda>n. fls_nth F (int n)) = conv_radius (\<lambda>n. fls_nth F (int n + fls_subdegree F))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 134 | proof (cases "fls_subdegree F \<ge> 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 135 | case True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 136 | hence "conv_radius (\<lambda>n. fls_nth F (int n + fls_subdegree F)) = | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 137 | conv_radius (\<lambda>n. fls_nth F (int (n + nat (fls_subdegree F))))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 138 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 139 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 140 | by (subst (asm) conv_radius_shift) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 141 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 142 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 143 | hence "conv_radius (\<lambda>n. fls_nth F (int n)) = | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 144 | conv_radius (\<lambda>n. fls_nth F (fls_subdegree F + int (n + nat (-fls_subdegree F))))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 145 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 146 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 147 | by (subst (asm) conv_radius_shift) (auto simp: add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 148 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 149 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 150 | by (simp add: fls_conv_radius_def fps_conv_radius_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 151 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 152 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 153 | lemma eval_fps_of_nat [simp]: "eval_fps (of_nat n) z = of_nat n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 154 | and eval_fps_of_int [simp]: "eval_fps (of_int m) z = of_int m" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 155 | by (simp_all flip: fps_of_nat fps_of_int) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 156 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 157 | lemma fls_subdegree_numeral [simp]: "fls_subdegree (numeral n) = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 158 | by (metis fls_subdegree_of_nat of_nat_numeral) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 159 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 160 | lemma fls_regpart_numeral [simp]: "fls_regpart (numeral n) = numeral n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 161 | by (metis fls_regpart_of_nat of_nat_numeral) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 162 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 163 | lemma fps_conv_radius_of_nat [simp]: "fps_conv_radius (of_nat n) = \<infinity>" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 164 | and fps_conv_radius_of_int [simp]: "fps_conv_radius (of_int m) = \<infinity>" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 165 | by (simp_all flip: fps_of_nat fps_of_int) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 166 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 167 | lemma fps_conv_radius_fls_regpart: "fps_conv_radius (fls_regpart F) = fls_conv_radius F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 168 | by (simp add: fls_conv_radius_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 169 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 170 | lemma fls_conv_radius_0 [simp]: "fls_conv_radius 0 = \<infinity>" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 171 | and fls_conv_radius_1 [simp]: "fls_conv_radius 1 = \<infinity>" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 172 | and fls_conv_radius_const [simp]: "fls_conv_radius (fls_const c) = \<infinity>" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 173 | and fls_conv_radius_numeral [simp]: "fls_conv_radius (numeral num) = \<infinity>" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 174 | and fls_conv_radius_of_nat [simp]: "fls_conv_radius (of_nat n) = \<infinity>" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 175 | and fls_conv_radius_of_int [simp]: "fls_conv_radius (of_int m) = \<infinity>" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 176 | and fls_conv_radius_X [simp]: "fls_conv_radius fls_X = \<infinity>" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 177 | and fls_conv_radius_X_inv [simp]: "fls_conv_radius fls_X_inv = \<infinity>" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 178 | and fls_conv_radius_X_intpow [simp]: "fls_conv_radius (fls_X_intpow m) = \<infinity>" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 179 | by (simp_all add: fls_conv_radius_def fls_X_intpow_regpart) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 180 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 181 | lemma fls_conv_radius_shift [simp]: "fls_conv_radius (fls_shift n F) = fls_conv_radius F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 182 | unfolding fls_conv_radius_altdef by (subst fls_base_factor_to_fps_shift) (rule refl) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 183 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 184 | lemma fls_conv_radius_fps_to_fls [simp]: "fls_conv_radius (fps_to_fls F) = fps_conv_radius F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 185 | by (simp add: fls_conv_radius_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 186 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 187 | lemma fls_conv_radius_deriv [simp]: "fls_conv_radius (fls_deriv F) \<ge> fls_conv_radius F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 188 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 189 | have "fls_conv_radius (fls_deriv F) = fps_conv_radius (fls_regpart (fls_deriv F))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 190 | by (simp add: fls_conv_radius_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 191 | also have "fls_regpart (fls_deriv F) = fps_deriv (fls_regpart F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 192 | by (intro fps_ext) (auto simp: add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 193 | also have "fps_conv_radius \<dots> \<ge> fls_conv_radius F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 194 | by (simp add: fls_conv_radius_def fps_conv_radius_deriv) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 195 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 196 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 197 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 198 | lemma fls_conv_radius_uminus [simp]: "fls_conv_radius (-F) = fls_conv_radius F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 199 | by (simp add: fls_conv_radius_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 200 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 201 | lemma fls_conv_radius_add: "fls_conv_radius (F + G) \<ge> min (fls_conv_radius F) (fls_conv_radius G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 202 | by (simp add: fls_conv_radius_def fps_conv_radius_add) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 203 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 204 | lemma fls_conv_radius_diff: "fls_conv_radius (F - G) \<ge> min (fls_conv_radius F) (fls_conv_radius G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 205 | by (simp add: fls_conv_radius_def fps_conv_radius_diff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 206 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 207 | lemma fls_conv_radius_mult: "fls_conv_radius (F * G) \<ge> min (fls_conv_radius F) (fls_conv_radius G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 208 | proof (cases "F = 0 \<or> G = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 209 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 210 | hence [simp]: "F \<noteq> 0" "G \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 211 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 212 | have "fls_conv_radius (F * G) = fps_conv_radius (fls_regpart (fls_shift (fls_subdegree F + fls_subdegree G) (F * G)))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 213 | by (simp add: fls_conv_radius_altdef) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 214 | also have "fls_regpart (fls_shift (fls_subdegree F + fls_subdegree G) (F * G)) = | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 215 | fls_base_factor_to_fps F * fls_base_factor_to_fps G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 216 | by (simp add: fls_times_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 217 | also have "fps_conv_radius \<dots> \<ge> min (fls_conv_radius F) (fls_conv_radius G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 218 | unfolding fls_conv_radius_altdef by (rule fps_conv_radius_mult) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 219 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 220 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 221 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 222 | lemma fps_conv_radius_add_ge: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 223 | "fps_conv_radius F \<ge> r \<Longrightarrow> fps_conv_radius G \<ge> r \<Longrightarrow> fps_conv_radius (F + G) \<ge> r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 224 | using fps_conv_radius_add[of F G] by (simp add: min_def split: if_splits) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 225 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 226 | lemma fps_conv_radius_diff_ge: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 227 | "fps_conv_radius F \<ge> r \<Longrightarrow> fps_conv_radius G \<ge> r \<Longrightarrow> fps_conv_radius (F - G) \<ge> r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 228 | using fps_conv_radius_diff[of F G] by (simp add: min_def split: if_splits) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 229 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 230 | lemma fps_conv_radius_mult_ge: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 231 | "fps_conv_radius F \<ge> r \<Longrightarrow> fps_conv_radius G \<ge> r \<Longrightarrow> fps_conv_radius (F * G) \<ge> r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 232 | using fps_conv_radius_mult[of F G] by (simp add: min_def split: if_splits) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 233 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 234 | lemma fls_conv_radius_add_ge: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 235 | "fls_conv_radius F \<ge> r \<Longrightarrow> fls_conv_radius G \<ge> r \<Longrightarrow> fls_conv_radius (F + G) \<ge> r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 236 | using fls_conv_radius_add[of F G] by (simp add: min_def split: if_splits) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 237 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 238 | lemma fls_conv_radius_diff_ge: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 239 | "fls_conv_radius F \<ge> r \<Longrightarrow> fls_conv_radius G \<ge> r \<Longrightarrow> fls_conv_radius (F - G) \<ge> r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 240 | using fls_conv_radius_diff[of F G] by (simp add: min_def split: if_splits) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 241 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 242 | lemma fls_conv_radius_mult_ge: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 243 | "fls_conv_radius F \<ge> r \<Longrightarrow> fls_conv_radius G \<ge> r \<Longrightarrow> fls_conv_radius (F * G) \<ge> r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 244 | using fls_conv_radius_mult[of F G] by (simp add: min_def split: if_splits) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 245 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 246 | lemma fls_conv_radius_power: "fls_conv_radius (F ^ n) \<ge> fls_conv_radius F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 247 | by (induction n) (auto intro!: fls_conv_radius_mult_ge) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 248 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 249 | lemma eval_fls_0 [simp]: "eval_fls 0 z = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 250 | and eval_fls_1 [simp]: "eval_fls 1 z = 1" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 251 | and eval_fls_const [simp]: "eval_fls (fls_const c) z = c" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 252 | and eval_fls_numeral [simp]: "eval_fls (numeral num) z = numeral num" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 253 | and eval_fls_of_nat [simp]: "eval_fls (of_nat n) z = of_nat n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 254 | and eval_fls_of_int [simp]: "eval_fls (of_int m) z = of_int m" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 255 | and eval_fls_X [simp]: "eval_fls fls_X z = z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 256 | and eval_fls_X_intpow [simp]: "eval_fls (fls_X_intpow m) z = z powi m" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 257 | by (simp_all add: eval_fls_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 258 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 259 | lemma eval_fls_at_0: "eval_fls F 0 = (if fls_subdegree F \<ge> 0 then fls_nth F 0 else 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 260 | by (cases "fls_subdegree F = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 261 | (simp_all add: eval_fls_def fls_regpart_def eval_fps_at_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 262 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 263 | lemma eval_fps_to_fls: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 264 | assumes "norm z < fps_conv_radius F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 265 | shows "eval_fls (fps_to_fls F) z = eval_fps F z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 266 | proof (cases "F = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 267 | case [simp]: False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 268 | have "eval_fps F z = eval_fps (unit_factor F * normalize F) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 269 | by (metis unit_factor_mult_normalize) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 270 | also have "\<dots> = eval_fps (unit_factor F * fps_X ^ subdegree F) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 271 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 272 | also have "\<dots> = eval_fps (unit_factor F) z * z ^ subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 273 | using assms by (subst eval_fps_mult) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 274 | also have "\<dots> = eval_fls (fps_to_fls F) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 275 | unfolding eval_fls_def fls_base_factor_to_fps_to_fls fls_subdegree_fls_to_fps | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 276 | power_int_of_nat .. | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 277 | finally show ?thesis .. | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 278 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 279 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 280 | lemma eval_fls_shift: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 281 | assumes [simp]: "z \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 282 | shows "eval_fls (fls_shift n F) z = eval_fls F z * z powi -n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 283 | proof (cases "F = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 284 | case [simp]: False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 285 | show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 286 | unfolding eval_fls_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 287 | by (subst fls_base_factor_to_fps_shift, subst fls_shift_subdegree[OF \<open>F \<noteq> 0\<close>], subst power_int_diff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 288 | (auto simp: power_int_minus divide_simps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 289 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 290 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 291 | lemma eval_fls_add: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 292 | assumes "ereal (norm z) < fls_conv_radius F" "ereal (norm z) < fls_conv_radius G" "z \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 293 | shows "eval_fls (F + G) z = eval_fls F z + eval_fls G z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 294 | using assms | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 295 | proof (induction "fls_subdegree F" "fls_subdegree G" arbitrary: F G rule: linorder_wlog) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 296 | case (sym F G) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 297 | show ?case | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 298 | using sym(1)[of G F] sym(2-) by (simp add: add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 299 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 300 | case (le F G) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 301 | show ?case | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 302 | proof (cases "F = 0 \<or> G = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 303 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 304 | hence [simp]: "F \<noteq> 0" "G \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 305 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 306 | note [simp] = \<open>z \<noteq> 0\<close> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 307 | define F' G' where "F' = fls_base_factor_to_fps F" "G' = fls_base_factor_to_fps G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 308 | define m n where "m = fls_subdegree F" "n = fls_subdegree G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 309 | have "m \<le> n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 310 | using le by (auto simp: m_n_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 311 | have conv1: "ereal (cmod z) < fps_conv_radius F'" "ereal (cmod z) < fps_conv_radius G'" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 312 | using assms le by (simp_all add: F'_G'_def fls_conv_radius_altdef) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 313 | have conv2: "ereal (cmod z) < fps_conv_radius (G' * fps_X ^ nat (n - m))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 314 | using conv1 by (intro less_le_trans[OF _ fps_conv_radius_mult]) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 315 | have conv3: "ereal (cmod z) < fps_conv_radius (F' + G' * fps_X ^ nat (n - m))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 316 | using conv1 conv2 by (intro less_le_trans[OF _ fps_conv_radius_add]) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 317 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 318 | have "eval_fls F z + eval_fls G z = eval_fps F' z * z powi m + eval_fps G' z * z powi n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 319 | unfolding eval_fls_def m_n_def[symmetric] F'_G'_def[symmetric] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 320 | by (simp add: power_int_add algebra_simps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 321 | also have "\<dots> = (eval_fps F' z + eval_fps G' z * z powi (n - m)) * z powi m" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 322 | by (simp add: algebra_simps power_int_diff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 323 | also have "eval_fps G' z * z powi (n - m) = eval_fps (G' * fps_X ^ nat (n - m)) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 324 | using assms \<open>m \<le> n\<close> conv1 by (subst eval_fps_mult) (auto simp: power_int_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 325 | also have "eval_fps F' z + \<dots> = eval_fps (F' + G' * fps_X ^ nat (n - m)) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 326 | using conv1 conv2 by (subst eval_fps_add) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 327 | also have "\<dots> = eval_fls (fps_to_fls (F' + G' * fps_X ^ nat (n - m))) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 328 | using conv3 by (subst eval_fps_to_fls) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 329 | also have "\<dots> * z powi m = eval_fls (fls_shift (-m) (fps_to_fls (F' + G' * fps_X ^ nat (n - m)))) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 330 | by (subst eval_fls_shift) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 331 | also have "fls_shift (-m) (fps_to_fls (F' + G' * fps_X ^ nat (n - m))) = F + G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 332 | using \<open>m \<le> n\<close> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 333 | by (simp add: fls_times_fps_to_fls fps_to_fls_power fls_X_power_conv_shift_1 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 334 | fls_shifted_times_simps F'_G'_def m_n_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 335 | finally show ?thesis .. | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 336 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 337 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 338 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 339 | lemma eval_fls_minus: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 340 | assumes "ereal (norm z) < fls_conv_radius F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 341 | shows "eval_fls (-F) z = -eval_fls F z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 342 | using assms by (simp add: eval_fls_def eval_fps_minus fls_conv_radius_altdef) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 343 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 344 | lemma eval_fls_diff: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 345 | assumes "ereal (norm z) < fls_conv_radius F" "ereal (norm z) < fls_conv_radius G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 346 | and [simp]: "z \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 347 | shows "eval_fls (F - G) z = eval_fls F z - eval_fls G z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 348 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 349 | have "eval_fls (F + (-G)) z = eval_fls F z - eval_fls G z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 350 | using assms by (subst eval_fls_add) (auto simp: eval_fls_minus) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 351 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 352 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 353 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 354 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 355 | lemma eval_fls_mult: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 356 | assumes "ereal (norm z) < fls_conv_radius F" "ereal (norm z) < fls_conv_radius G" "z \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 357 | shows "eval_fls (F * G) z = eval_fls F z * eval_fls G z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 358 | proof (cases "F = 0 \<or> G = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 359 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 360 | hence [simp]: "F \<noteq> 0" "G \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 361 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 362 | note [simp] = \<open>z \<noteq> 0\<close> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 363 | define F' G' where "F' = fls_base_factor_to_fps F" "G' = fls_base_factor_to_fps G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 364 | define m n where "m = fls_subdegree F" "n = fls_subdegree G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 365 | have "eval_fls F z * eval_fls G z = (eval_fps F' z * eval_fps G' z) * z powi (m + n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 366 | unfolding eval_fls_def m_n_def[symmetric] F'_G'_def[symmetric] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 367 | by (simp add: power_int_add algebra_simps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 368 | also have "\<dots> = eval_fps (F' * G') z * z powi (m + n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 369 | using assms by (subst eval_fps_mult) (auto simp: F'_G'_def fls_conv_radius_altdef) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 370 | also have "\<dots> = eval_fls (F * G) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 371 | by (simp add: eval_fls_def F'_G'_def m_n_def) (simp add: fls_times_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 372 | finally show ?thesis .. | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 373 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 374 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 375 | lemma eval_fls_power: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 376 | assumes "ereal (norm z) < fls_conv_radius F" "z \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 377 | shows "eval_fls (F ^ n) z = eval_fls F z ^ n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 378 | proof (induction n) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 379 | case (Suc n) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 380 | have "eval_fls (F ^ Suc n) z = eval_fls (F * F ^ n) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 381 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 382 | also have "\<dots> = eval_fls F z * eval_fls (F ^ n) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 383 | using assms by (subst eval_fls_mult) (auto intro!: less_le_trans[OF _ fls_conv_radius_power]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 384 | finally show ?case | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 385 | using Suc by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 386 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 387 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 388 | lemma norm_summable_fls: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 389 | "norm z < fls_conv_radius f \<Longrightarrow> summable (\<lambda>n. norm (fls_nth f n * z ^ n))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 390 | using norm_summable_fps[of z "fls_regpart f"] by (simp add: fls_conv_radius_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 391 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 392 | lemma norm_summable_fls': | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 393 | "norm z < fls_conv_radius f \<Longrightarrow> summable (\<lambda>n. norm (fls_nth f (n + fls_subdegree f) * z ^ n))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 394 | using norm_summable_fps[of z "fls_base_factor_to_fps f"] by (simp add: fls_conv_radius_altdef) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 395 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 396 | lemma summable_fls: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 397 | "norm z < fls_conv_radius f \<Longrightarrow> summable (\<lambda>n. fls_nth f n * z ^ n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 398 | by (rule summable_norm_cancel[OF norm_summable_fls]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 399 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 400 | theorem sums_eval_fls: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 401 | fixes f | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 402 | defines "n \<equiv> fls_subdegree f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 403 | assumes "norm z < fls_conv_radius f" and "z \<noteq> 0 \<or> n \<ge> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 404 | shows "(\<lambda>k. fls_nth f (int k + n) * z powi (int k + n)) sums eval_fls f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 405 | proof (cases "z = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 406 | case [simp]: False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 407 | have "(\<lambda>k. fps_nth (fls_base_factor_to_fps f) k * z ^ k * z powi n) sums | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 408 | (eval_fps (fls_base_factor_to_fps f) z * z powi n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 409 | using assms(2) by (intro sums_eval_fps sums_mult2) (auto simp: fls_conv_radius_altdef) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 410 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 411 | by (simp add: power_int_add n_def eval_fls_def mult_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 412 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 413 | case [simp]: True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 414 | with assms have "n \<ge> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 415 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 416 | have "(\<lambda>k. fls_nth f (int k + n) * z powi (int k + n)) sums | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 417 |           (\<Sum>k\<in>(if n \<le> 0 then {nat (-n)} else {}). fls_nth f (int k + n) * z powi (int k + n))"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 418 | by (intro sums_finite) (auto split: if_splits) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 419 | also have "\<dots> = eval_fls f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 420 | using \<open>n \<ge> 0\<close> by (auto simp: eval_fls_at_0 n_def not_le) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 421 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 422 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 423 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 424 | lemma holomorphic_on_eval_fls: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 425 | fixes f | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 426 | defines "n \<equiv> fls_subdegree f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 427 |   assumes "A \<subseteq> eball 0 (fls_conv_radius f) - (if n \<ge> 0 then {} else {0})"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 428 | shows "eval_fls f holomorphic_on A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 429 | proof (cases "n \<ge> 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 430 | case True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 431 | have "eval_fls f = (\<lambda>z. eval_fps (fls_base_factor_to_fps f) z * z ^ nat n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 432 | using True by (simp add: fun_eq_iff eval_fls_def power_int_def n_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 433 | moreover have "\<dots> holomorphic_on A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 434 | using True assms(2) by (intro holomorphic_intros) (auto simp: fls_conv_radius_altdef) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 435 | ultimately show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 436 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 437 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 438 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 439 | show ?thesis using assms | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 440 | unfolding eval_fls_def by (intro holomorphic_intros) (auto simp: fls_conv_radius_altdef) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 441 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 442 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 443 | lemma holomorphic_on_eval_fls' [holomorphic_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 444 | assumes "g holomorphic_on A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 445 |   assumes "g ` A \<subseteq> eball 0 (fls_conv_radius f) - (if fls_subdegree f \<ge> 0 then {} else {0})"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 446 | shows "(\<lambda>x. eval_fls f (g x)) holomorphic_on A" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 447 | by (meson assms holomorphic_on_compose holomorphic_on_eval_fls holomorphic_transform o_def) | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 448 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 449 | lemma continuous_on_eval_fls: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 450 | fixes f | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 451 | defines "n \<equiv> fls_subdegree f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 452 |   assumes "A \<subseteq> eball 0 (fls_conv_radius f) - (if n \<ge> 0 then {} else {0})"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 453 | shows "continuous_on A (eval_fls f)" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 454 | using assms holomorphic_on_eval_fls holomorphic_on_imp_continuous_on by blast | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 455 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 456 | lemma continuous_on_eval_fls' [continuous_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 457 | fixes f | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 458 | defines "n \<equiv> fls_subdegree f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 459 |   assumes "g ` A \<subseteq> eball 0 (fls_conv_radius f) - (if n \<ge> 0 then {} else {0})"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 460 | assumes "continuous_on A g" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 461 | shows "continuous_on A (\<lambda>x. eval_fls f (g x))" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 462 | by (metis assms continuous_on_compose2 continuous_on_eval_fls order.refl) | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 463 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 464 | lemmas has_field_derivative_eval_fps' [derivative_intros] = | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 465 | DERIV_chain2[OF has_field_derivative_eval_fps] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 466 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 467 | lemma fps_deriv_fls_regpart: "fps_deriv (fls_regpart F) = fls_regpart (fls_deriv F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 468 | by (intro fps_ext) (auto simp: add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 469 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 470 | (* TODO: generalise for nonneg subdegree *) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 471 | lemma has_field_derivative_eval_fls: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 472 |   assumes "z \<in> eball 0 (fls_conv_radius f) - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 473 | shows "(eval_fls f has_field_derivative eval_fls (fls_deriv f) z) (at z within A)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 474 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 475 | define g where "g = fls_base_factor_to_fps f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 476 | define n where "n = fls_subdegree f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 477 | have [simp]: "fps_conv_radius g = fls_conv_radius f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 478 | by (simp add: fls_conv_radius_altdef g_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 479 | have conv1: "fps_conv_radius (fps_deriv g * fps_X) \<ge> fls_conv_radius f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 480 | by (intro fps_conv_radius_mult_ge order.trans[OF _ fps_conv_radius_deriv]) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 481 | have conv2: "fps_conv_radius (of_int n * g) \<ge> fls_conv_radius f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 482 | by (intro fps_conv_radius_mult_ge) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 483 | have conv3: "fps_conv_radius (fps_deriv g * fps_X + of_int n * g) \<ge> fls_conv_radius f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 484 | by (intro fps_conv_radius_add_ge conv1 conv2) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 485 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 486 | have [simp]: "fps_conv_radius g = fls_conv_radius f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 487 | by (simp add: g_def fls_conv_radius_altdef) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 488 | have "((\<lambda>z. eval_fps g z * z powi fls_subdegree f) has_field_derivative | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 489 | (eval_fps (fps_deriv g) z * z powi n + of_int n * z powi (n - 1) * eval_fps g z)) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 490 | (at z within A)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 491 | using assms by (auto intro!: derivative_eq_intros simp: n_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 492 | also have "(\<lambda>z. eval_fps g z * z powi fls_subdegree f) = eval_fls f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 493 | by (simp add: eval_fls_def g_def fun_eq_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 494 | also have "eval_fps (fps_deriv g) z * z powi n + of_int n * z powi (n - 1) * eval_fps g z = | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 495 | (z * eval_fps (fps_deriv g) z + of_int n * eval_fps g z) * z powi (n - 1)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 496 | using assms by (auto simp: power_int_diff field_simps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 497 | also have "(z * eval_fps (fps_deriv g) z + of_int n * eval_fps g z) = | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 498 | eval_fps (fps_deriv g * fps_X + of_int n * g) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 499 | using conv1 conv2 assms fps_conv_radius_deriv[of g] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 500 | by (subst eval_fps_add) (auto simp: eval_fps_mult) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 501 | also have "\<dots> = eval_fls (fps_to_fls (fps_deriv g * fps_X + of_int n * g)) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 502 | using conv3 assms by (subst eval_fps_to_fls) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 503 | also have "\<dots> * z powi (n - 1) = eval_fls (fls_shift (1 - n) (fps_to_fls (fps_deriv g * fps_X + of_int n * g))) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 504 | using assms by (subst eval_fls_shift) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 505 | also have "fls_shift (1 - n) (fps_to_fls (fps_deriv g * fps_X + of_int n * g)) = fls_deriv f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 506 | by (intro fls_eqI) (auto simp: g_def n_def algebra_simps eq_commute[of _ "fls_subdegree f"]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 507 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 508 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 509 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 510 | lemma eval_fls_deriv: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 511 |   assumes "z \<in> eball 0 (fls_conv_radius F) - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 512 | shows "eval_fls (fls_deriv F) z = deriv (eval_fls F) z" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 513 | by (metis DERIV_imp_deriv assms has_field_derivative_eval_fls) | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 514 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 515 | lemma analytic_on_eval_fls: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 516 |   assumes "A \<subseteq> eball 0 (fls_conv_radius f) - (if fls_subdegree f \<ge> 0 then {} else {0})"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 517 | shows "eval_fls f analytic_on A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 518 | proof (rule analytic_on_subset [OF _ assms]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 519 |   show "eval_fls f analytic_on eball 0 (fls_conv_radius f) - (if fls_subdegree f \<ge> 0 then {} else {0})"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 520 | using holomorphic_on_eval_fls[OF order.refl] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 521 | by (subst analytic_on_open) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 522 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 523 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 524 | lemma analytic_on_eval_fls' [analytic_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 525 | assumes "g analytic_on A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 526 |   assumes "g ` A \<subseteq> eball 0 (fls_conv_radius f) - (if fls_subdegree f \<ge> 0 then {} else {0})"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 527 | shows "(\<lambda>x. eval_fls f (g x)) analytic_on A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 528 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 529 | have "eval_fls f \<circ> g analytic_on A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 530 | by (intro analytic_on_compose[OF assms(1) analytic_on_eval_fls]) (use assms in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 531 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 532 | by (simp add: o_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 533 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 534 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 535 | lemma continuous_eval_fls [continuous_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 536 |   assumes "z \<in> eball 0 (fls_conv_radius F) - (if fls_subdegree F \<ge> 0 then {} else {0})"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 537 | shows "continuous (at z within A) (eval_fls F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 538 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 539 | have "isCont (eval_fls F) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 540 | using continuous_on_eval_fls[OF order.refl] assms | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 541 | by (subst (asm) continuous_on_eq_continuous_at) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 542 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 543 | using continuous_at_imp_continuous_at_within by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 544 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 545 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 546 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 547 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 548 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 549 | named_theorems laurent_expansion_intros | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 550 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 551 | lemma has_laurent_expansion_imp_asymp_equiv_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 552 | assumes F: "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 553 | defines "n \<equiv> fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 554 | shows "f \<sim>[at 0] (\<lambda>z. fls_nth F n * z powi n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 555 | proof (cases "F = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 556 | case True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 557 | thus ?thesis using assms | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 558 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 559 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 560 | case [simp]: False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 561 | define G where "G = fls_base_factor_to_fps F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 562 | have "fls_conv_radius F > 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 563 | using F by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 564 | hence "isCont (eval_fps G) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 565 | by (intro continuous_intros) (auto simp: G_def fps_conv_radius_fls_regpart zero_ereal_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 566 | hence lim: "eval_fps G \<midarrow>0\<rightarrow> eval_fps G 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 567 | by (meson isContD) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 568 | have [simp]: "fps_nth G 0 \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 569 | by (auto simp: G_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 570 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 571 | have "f \<sim>[at 0] eval_fls F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 572 | using F by (intro asymp_equiv_refl_ev) (auto simp: has_laurent_expansion_def eq_commute) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 573 | also have "\<dots> = (\<lambda>z. eval_fps G z * z powi n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 574 | by (intro ext) (simp_all add: eval_fls_def G_def n_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 575 | also have "\<dots> \<sim>[at 0] (\<lambda>z. fps_nth G 0 * z powi n)" using lim | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 576 | by (intro asymp_equiv_intros tendsto_imp_asymp_equiv_const) (auto simp: eval_fps_at_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 577 | also have "fps_nth G 0 = fls_nth F n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 578 | by (simp add: G_def n_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 579 | finally show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 580 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 581 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 582 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 583 | lemma has_laurent_expansion_imp_asymp_equiv: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 584 | assumes F: "(\<lambda>w. f (z + w)) has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 585 | defines "n \<equiv> fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 586 | shows "f \<sim>[at z] (\<lambda>w. fls_nth F n * (w - z) powi n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 587 | using has_laurent_expansion_imp_asymp_equiv_0[OF assms(1)] unfolding n_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 588 | by (simp add: at_to_0[of z] asymp_equiv_filtermap_iff add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 589 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 590 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 591 | lemmas [tendsto_intros del] = tendsto_power_int | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 592 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 593 | lemma has_laurent_expansion_imp_tendsto_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 594 | assumes F: "f has_laurent_expansion F" and "fls_subdegree F \<ge> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 595 | shows "f \<midarrow>0\<rightarrow> fls_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 596 | proof (rule asymp_equiv_tendsto_transfer) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 597 | show "(\<lambda>z. fls_nth F (fls_subdegree F) * z powi fls_subdegree F) \<sim>[at 0] f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 598 | by (rule asymp_equiv_symI, rule has_laurent_expansion_imp_asymp_equiv_0) fact | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 599 | show "(\<lambda>z. fls_nth F (fls_subdegree F) * z powi fls_subdegree F) \<midarrow>0\<rightarrow> fls_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 600 | by (rule tendsto_eq_intros refl | use assms(2) in simp)+ | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 601 | (use assms(2) in \<open>auto simp: power_int_0_left_If\<close>) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 602 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 603 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 604 | lemma has_laurent_expansion_imp_tendsto: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 605 | assumes F: "(\<lambda>w. f (z + w)) has_laurent_expansion F" and "fls_subdegree F \<ge> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 606 | shows "f \<midarrow>z\<rightarrow> fls_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 607 | using has_laurent_expansion_imp_tendsto_0[OF assms] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 608 | by (simp add: at_to_0[of z] filterlim_filtermap add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 609 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 610 | lemma has_laurent_expansion_imp_filterlim_infinity_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 611 | assumes F: "f has_laurent_expansion F" and "fls_subdegree F < 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 612 | shows "filterlim f at_infinity (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 613 | proof (rule asymp_equiv_at_infinity_transfer) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 614 | have [simp]: "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 615 | using assms(2) by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 616 | show "(\<lambda>z. fls_nth F (fls_subdegree F) * z powi fls_subdegree F) \<sim>[at 0] f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 617 | by (rule asymp_equiv_symI, rule has_laurent_expansion_imp_asymp_equiv_0) fact | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 618 | show "filterlim (\<lambda>z. fls_nth F (fls_subdegree F) * z powi fls_subdegree F) at_infinity (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 619 | by (rule tendsto_mult_filterlim_at_infinity tendsto_const | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 620 | filterlim_power_int_neg_at_infinity | use assms(2) in simp)+ | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 621 | (auto simp: eventually_at_filter) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 622 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 623 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 624 | lemma has_laurent_expansion_imp_neg_fls_subdegree: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 625 | assumes F: "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 626 | and infy:"filterlim f at_infinity (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 627 | shows "fls_subdegree F < 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 628 | proof (rule ccontr) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 629 | assume asm:"\<not> fls_subdegree F < 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 630 | define ff where "ff=(\<lambda>z. fls_nth F (fls_subdegree F) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 631 | * z powi fls_subdegree F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 632 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 633 | have "(ff \<longlongrightarrow> (if fls_subdegree F =0 then fls_nth F 0 else 0)) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 634 | using asm unfolding ff_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 635 | by (auto intro!: tendsto_eq_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 636 | moreover have "filterlim ff at_infinity (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 637 | proof (rule asymp_equiv_at_infinity_transfer) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 638 | show "f \<sim>[at 0] ff" unfolding ff_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 639 | using has_laurent_expansion_imp_asymp_equiv_0[OF F] unfolding ff_def . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 640 | show "filterlim f at_infinity (at 0)" by fact | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 641 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 642 | ultimately show False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 643 | using not_tendsto_and_filterlim_at_infinity[of "at (0::complex)"] by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 644 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 645 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 646 | lemma has_laurent_expansion_imp_filterlim_infinity: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 647 | assumes F: "(\<lambda>w. f (z + w)) has_laurent_expansion F" and "fls_subdegree F < 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 648 | shows "filterlim f at_infinity (at z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 649 | using has_laurent_expansion_imp_filterlim_infinity_0[OF assms] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 650 | by (simp add: at_to_0[of z] filterlim_filtermap add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 651 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 652 | lemma has_laurent_expansion_imp_is_pole_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 653 | assumes F: "f has_laurent_expansion F" and "fls_subdegree F < 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 654 | shows "is_pole f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 655 | using has_laurent_expansion_imp_filterlim_infinity_0[OF assms] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 656 | by (simp add: is_pole_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 657 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 658 | lemma is_pole_0_imp_neg_fls_subdegree: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 659 | assumes F: "f has_laurent_expansion F" and "is_pole f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 660 | shows "fls_subdegree F < 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 661 | using F assms(2) has_laurent_expansion_imp_neg_fls_subdegree is_pole_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 662 | by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 663 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 664 | lemma has_laurent_expansion_imp_is_pole: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 665 | assumes F: "(\<lambda>x. f (z + x)) has_laurent_expansion F" and "fls_subdegree F < 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 666 | shows "is_pole f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 667 | using has_laurent_expansion_imp_is_pole_0[OF assms] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 668 | by (simp add: is_pole_shift_0') | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 669 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 670 | lemma is_pole_imp_neg_fls_subdegree: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 671 | assumes F: "(\<lambda>x. f (z + x)) has_laurent_expansion F" and "is_pole f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 672 | shows "fls_subdegree F < 0" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 673 | proof - | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 674 | have "is_pole (\<lambda>x. f (z + x)) 0" | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 675 | using assms(2) is_pole_shift_0 by blast | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 676 | then show ?thesis | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 677 | using F is_pole_0_imp_neg_fls_subdegree by blast | 
| 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 678 | qed | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 679 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 680 | lemma is_pole_fls_subdegree_iff: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 681 | assumes "(\<lambda>x. f (z + x)) has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 682 | shows "is_pole f z \<longleftrightarrow> fls_subdegree F < 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 683 | using assms is_pole_imp_neg_fls_subdegree has_laurent_expansion_imp_is_pole | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 684 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 685 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 686 | lemma | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 687 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 688 | shows has_laurent_expansion_isolated_0: "isolated_singularity_at f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 689 | and has_laurent_expansion_not_essential_0: "not_essential f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 690 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 691 | from assms have "eventually (\<lambda>z. eval_fls F z = f z) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 692 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 693 |   then obtain r where r: "r > 0" "\<And>z. z \<in> ball 0 r - {0} \<Longrightarrow> eval_fls F z = f z"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 694 | by (auto simp: eventually_at_filter ball_def eventually_nhds_metric) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 695 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 696 | have "fls_conv_radius F > 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 697 | using assms by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 698 | then obtain R :: real where R: "R > 0" "R \<le> min r (fls_conv_radius F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 699 | using \<open>r > 0\<close> by (metis dual_order.strict_implies_order ereal_dense2 ereal_less(2) min_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 700 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 701 |   have "eval_fls F holomorphic_on ball 0 R - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 702 | using r R by (intro holomorphic_intros ball_eball_mono Diff_mono) (auto simp: ereal_le_less) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 703 |   also have "?this \<longleftrightarrow> f holomorphic_on ball 0 R - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 704 | using r R by (intro holomorphic_cong) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 705 |   also have "\<dots> \<longleftrightarrow> f analytic_on ball 0 R - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 706 | by (subst analytic_on_open) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 707 | finally show "isolated_singularity_at f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 708 | unfolding isolated_singularity_at_def using \<open>R > 0\<close> by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 709 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 710 | show "not_essential f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 711 | proof (cases "fls_subdegree F \<ge> 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 712 | case True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 713 | hence "f \<midarrow>0\<rightarrow> fls_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 714 | by (intro has_laurent_expansion_imp_tendsto_0[OF assms]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 715 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 716 | by (auto simp: not_essential_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 717 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 718 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 719 | hence "is_pole f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 720 | by (intro has_laurent_expansion_imp_is_pole_0[OF assms]) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 721 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 722 | by (auto simp: not_essential_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 723 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 724 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 725 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 726 | lemma | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 727 | assumes "(\<lambda>w. f (z + w)) has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 728 | shows has_laurent_expansion_isolated: "isolated_singularity_at f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 729 | and has_laurent_expansion_not_essential: "not_essential f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 730 | using has_laurent_expansion_isolated_0[OF assms] has_laurent_expansion_not_essential_0[OF assms] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 731 | by (simp_all add: isolated_singularity_at_shift_0 not_essential_shift_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 732 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 733 | lemma has_laurent_expansion_fps: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 734 | assumes "f has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 735 | shows "f has_laurent_expansion fps_to_fls F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 736 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 737 | from assms have radius: "0 < fps_conv_radius F" and eval: "\<forall>\<^sub>F z in nhds 0. eval_fps F z = f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 738 | by (auto simp: has_fps_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 739 | from eval have eval': "\<forall>\<^sub>F z in at 0. eval_fps F z = f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 740 | using eventually_at_filter eventually_mono by fastforce | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 741 |   moreover have "eventually (\<lambda>z. z \<in> eball 0 (fps_conv_radius F) - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 742 | using radius by (intro eventually_at_in_open) (auto simp: zero_ereal_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 743 | ultimately have "eventually (\<lambda>z. eval_fls (fps_to_fls F) z = f z) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 744 | by eventually_elim (auto simp: eval_fps_to_fls) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 745 | thus ?thesis using radius | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 746 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 747 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 748 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 749 | lemma has_laurent_expansion_const [simp, intro, laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 750 | "(\<lambda>_. c) has_laurent_expansion fls_const c" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 751 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 752 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 753 | lemma has_laurent_expansion_0 [simp, intro, laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 754 | "(\<lambda>_. 0) has_laurent_expansion 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 755 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 756 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 757 | lemma has_fps_expansion_0_iff: "f has_fps_expansion 0 \<longleftrightarrow> eventually (\<lambda>z. f z = 0) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 758 | by (auto simp: has_fps_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 759 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 760 | lemma has_laurent_expansion_1 [simp, intro, laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 761 | "(\<lambda>_. 1) has_laurent_expansion 1" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 762 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 763 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 764 | lemma has_laurent_expansion_numeral [simp, intro, laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 765 | "(\<lambda>_. numeral n) has_laurent_expansion numeral n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 766 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 767 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 768 | lemma has_laurent_expansion_fps_X_power [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 769 | "(\<lambda>x. x ^ n) has_laurent_expansion (fls_X_intpow n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 770 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 771 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 772 | lemma has_laurent_expansion_fps_X_power_int [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 773 | "(\<lambda>x. x powi n) has_laurent_expansion (fls_X_intpow n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 774 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 775 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 776 | lemma has_laurent_expansion_fps_X [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 777 | "(\<lambda>x. x) has_laurent_expansion fls_X" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 778 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 779 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 780 | lemma has_laurent_expansion_cmult_left [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 781 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 782 | shows "(\<lambda>x. c * f x) has_laurent_expansion fls_const c * F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 783 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 784 |   from assms have "eventually (\<lambda>z. z \<in> eball 0 (fls_conv_radius F) - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 785 | by (intro eventually_at_in_open) (auto simp: has_laurent_expansion_def zero_ereal_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 786 | moreover from assms have "eventually (\<lambda>z. eval_fls F z = f z) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 787 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 788 | ultimately have "eventually (\<lambda>z. eval_fls (fls_const c * F) z = c * f z) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 789 | by eventually_elim (simp_all add: eval_fls_mult) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 790 | with assms show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 791 | by (auto simp: has_laurent_expansion_def intro!: less_le_trans[OF _ fls_conv_radius_mult]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 792 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 793 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 794 | lemma has_laurent_expansion_cmult_right [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 795 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 796 | shows "(\<lambda>x. f x * c) has_laurent_expansion F * fls_const c" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 797 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 798 | have "F * fls_const c = fls_const c * F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 799 | by (intro fls_eqI) (auto simp: mult.commute) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 800 | with has_laurent_expansion_cmult_left [OF assms] show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 801 | by (simp add: mult.commute) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 802 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 803 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 804 | lemma has_fps_expansion_scaleR [fps_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 805 |   fixes F :: "'a :: {banach, real_normed_div_algebra, comm_ring_1} fps"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 806 | shows "f has_fps_expansion F \<Longrightarrow> (\<lambda>x. c *\<^sub>R f x) has_fps_expansion fps_const (of_real c) * F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 807 | unfolding scaleR_conv_of_real by (intro fps_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 808 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 809 | lemma has_laurent_expansion_scaleR [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 810 | "f has_laurent_expansion F \<Longrightarrow> (\<lambda>x. c *\<^sub>R f x) has_laurent_expansion fls_const (of_real c) * F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 811 | unfolding scaleR_conv_of_real by (intro laurent_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 812 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 813 | lemma has_laurent_expansion_minus [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 814 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 815 | shows "(\<lambda>x. - f x) has_laurent_expansion -F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 816 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 817 |   from assms have "eventually (\<lambda>x. x \<in> eball 0 (fls_conv_radius F) - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 818 | by (intro eventually_at_in_open) (auto simp: has_laurent_expansion_def zero_ereal_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 819 | moreover from assms have "eventually (\<lambda>x. eval_fls F x = f x) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 820 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 821 | ultimately have "eventually (\<lambda>x. eval_fls (-F) x = -f x) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 822 | by eventually_elim (auto simp: eval_fls_minus) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 823 | thus ?thesis using assms by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 824 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 825 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 826 | lemma has_laurent_expansion_add [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 827 | assumes "f has_laurent_expansion F" "g has_laurent_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 828 | shows "(\<lambda>x. f x + g x) has_laurent_expansion F + G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 829 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 830 | from assms have "0 < min (fls_conv_radius F) (fls_conv_radius G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 831 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 832 | also have "\<dots> \<le> fls_conv_radius (F + G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 833 | by (rule fls_conv_radius_add) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 834 | finally have radius: "\<dots> > 0" . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 835 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 836 |   from assms have "eventually (\<lambda>x. x \<in> eball 0 (fls_conv_radius F) - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 837 |                   "eventually (\<lambda>x. x \<in> eball 0 (fls_conv_radius G) - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 838 | by (intro eventually_at_in_open; force simp: has_laurent_expansion_def zero_ereal_def)+ | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 839 | moreover have "eventually (\<lambda>x. eval_fls F x = f x) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 840 | and "eventually (\<lambda>x. eval_fls G x = g x) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 841 | using assms by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 842 | ultimately have "eventually (\<lambda>x. eval_fls (F + G) x = f x + g x) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 843 | by eventually_elim (auto simp: eval_fls_add) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 844 | with radius show ?thesis by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 845 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 846 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 847 | lemma has_laurent_expansion_diff [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 848 | assumes "f has_laurent_expansion F" "g has_laurent_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 849 | shows "(\<lambda>x. f x - g x) has_laurent_expansion F - G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 850 | using has_laurent_expansion_add[of f F "\<lambda>x. - g x" "-G"] assms | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 851 | by (simp add: has_laurent_expansion_minus) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 852 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 853 | lemma has_laurent_expansion_mult [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 854 | assumes "f has_laurent_expansion F" "g has_laurent_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 855 | shows "(\<lambda>x. f x * g x) has_laurent_expansion F * G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 856 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 857 | from assms have "0 < min (fls_conv_radius F) (fls_conv_radius G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 858 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 859 | also have "\<dots> \<le> fls_conv_radius (F * G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 860 | by (rule fls_conv_radius_mult) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 861 | finally have radius: "\<dots> > 0" . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 862 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 863 |   from assms have "eventually (\<lambda>x. x \<in> eball 0 (fls_conv_radius F) - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 864 |                   "eventually (\<lambda>x. x \<in> eball 0 (fls_conv_radius G) - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 865 | by (intro eventually_at_in_open; force simp: has_laurent_expansion_def zero_ereal_def)+ | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 866 | moreover have "eventually (\<lambda>x. eval_fls F x = f x) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 867 | and "eventually (\<lambda>x. eval_fls G x = g x) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 868 | using assms by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 869 | ultimately have "eventually (\<lambda>x. eval_fls (F * G) x = f x * g x) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 870 | by eventually_elim (auto simp: eval_fls_mult) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 871 | with radius show ?thesis by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 872 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 873 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 874 | lemma has_fps_expansion_power [fps_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 875 |   fixes F :: "'a :: {banach, real_normed_div_algebra, comm_ring_1} fps"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 876 | shows "f has_fps_expansion F \<Longrightarrow> (\<lambda>x. f x ^ m) has_fps_expansion F ^ m" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 877 | by (induction m) (auto intro!: fps_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 878 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 879 | lemma has_laurent_expansion_power [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 880 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 881 | shows "(\<lambda>x. f x ^ n) has_laurent_expansion F ^ n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 882 | by (induction n) (auto intro!: laurent_expansion_intros assms) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 883 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 884 | lemma has_laurent_expansion_sum [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 885 | assumes "\<And>x. x \<in> I \<Longrightarrow> f x has_laurent_expansion F x" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 886 | shows "(\<lambda>y. \<Sum>x\<in>I. f x y) has_laurent_expansion (\<Sum>x\<in>I. F x)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 887 | using assms by (induction I rule: infinite_finite_induct) (auto intro!: laurent_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 888 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 889 | lemma has_laurent_expansion_prod [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 890 | assumes "\<And>x. x \<in> I \<Longrightarrow> f x has_laurent_expansion F x" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 891 | shows "(\<lambda>y. \<Prod>x\<in>I. f x y) has_laurent_expansion (\<Prod>x\<in>I. F x)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 892 | using assms by (induction I rule: infinite_finite_induct) (auto intro!: laurent_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 893 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 894 | lemma has_laurent_expansion_deriv [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 895 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 896 | shows "deriv f has_laurent_expansion fls_deriv F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 897 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 898 |   have "eventually (\<lambda>z. z \<in> eball 0 (fls_conv_radius F) - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 899 | using assms by (intro eventually_at_in_open) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 900 | (auto simp: has_laurent_expansion_def zero_ereal_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 901 | moreover from assms have "eventually (\<lambda>z. eval_fls F z = f z) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 902 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 903 |   then obtain s where "open s" "0 \<in> s" and s: "\<And>w. w \<in> s - {0} \<Longrightarrow> eval_fls F w = f w"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 904 | by (auto simp: eventually_nhds eventually_at_filter) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 905 |   hence "eventually (\<lambda>w. w \<in> s - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 906 | by (intro eventually_at_in_open) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 907 | ultimately have "eventually (\<lambda>z. eval_fls (fls_deriv F) z = deriv f z) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 908 | proof eventually_elim | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 909 | case (elim z) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 910 | hence "eval_fls (fls_deriv F) z = deriv (eval_fls F) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 911 | by (simp add: eval_fls_deriv) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 912 |     also have "eventually (\<lambda>w. w \<in> s - {0}) (nhds z)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 913 | using elim and \<open>open s\<close> by (intro eventually_nhds_in_open) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 914 | hence "eventually (\<lambda>w. eval_fls F w = f w) (nhds z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 915 | by eventually_elim (use s in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 916 | hence "deriv (eval_fls F) z = deriv f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 917 | by (intro deriv_cong_ev refl) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 918 | finally show ?case . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 919 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 920 | with assms show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 921 | by (auto simp: has_laurent_expansion_def intro!: less_le_trans[OF _ fls_conv_radius_deriv]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 922 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 923 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 924 | lemma has_laurent_expansion_shift [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 925 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 926 | shows "(\<lambda>x. f x * x powi n) has_laurent_expansion (fls_shift (-n) F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 927 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 928 |   have "eventually (\<lambda>x. x \<in> eball 0 (fls_conv_radius F) - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 929 | using assms by (intro eventually_at_in_open) (auto simp: has_laurent_expansion_def zero_ereal_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 930 | moreover have "eventually (\<lambda>x. eval_fls F x = f x) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 931 | using assms by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 932 | ultimately have "eventually (\<lambda>x. eval_fls (fls_shift (-n) F) x = f x * x powi n) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 933 | by eventually_elim (auto simp: eval_fls_shift assms) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 934 | with assms show ?thesis by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 935 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 936 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 937 | lemma has_laurent_expansion_shift' [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 938 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 939 | shows "(\<lambda>x. f x * x powi (-n)) has_laurent_expansion (fls_shift n F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 940 | using has_laurent_expansion_shift[OF assms, of "-n"] by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 941 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 942 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 943 | lemma has_laurent_expansion_deriv': | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 944 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 945 |   assumes "open A" "0 \<in> A" "\<And>x. x \<in> A - {0} \<Longrightarrow> (f has_field_derivative f' x) (at x)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 946 | shows "f' has_laurent_expansion fls_deriv F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 947 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 948 | have "deriv f has_laurent_expansion fls_deriv F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 949 | by (intro laurent_expansion_intros assms) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 950 | also have "?this \<longleftrightarrow> ?thesis" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 951 | proof (intro has_laurent_expansion_cong refl) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 952 |     have "eventually (\<lambda>z. z \<in> A - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 953 | by (intro eventually_at_in_open assms) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 954 | thus "eventually (\<lambda>z. deriv f z = f' z) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 955 | by eventually_elim (auto intro!: DERIV_imp_deriv assms) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 956 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 957 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 958 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 959 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 960 | definition laurent_expansion :: "(complex \<Rightarrow> complex) \<Rightarrow> complex \<Rightarrow> complex fls" where | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 961 | "laurent_expansion f z = | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 962 | (if eventually (\<lambda>z. f z = 0) (at z) then 0 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 963 | else fls_shift (-zorder f z) (fps_to_fls (fps_expansion (zor_poly f z) z)))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 964 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 965 | lemma laurent_expansion_cong: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 966 | assumes "eventually (\<lambda>w. f w = g w) (at z)" "z = z'" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 967 | shows "laurent_expansion f z = laurent_expansion g z'" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 968 | unfolding laurent_expansion_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 969 | using zor_poly_cong[OF assms(1,2)] zorder_cong[OF assms] assms | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 970 | by (intro if_cong refl) (auto elim: eventually_elim2) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 971 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 972 | theorem not_essential_has_laurent_expansion_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 973 | assumes "isolated_singularity_at f 0" "not_essential f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 974 | shows "f has_laurent_expansion laurent_expansion f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 975 | proof (cases "\<exists>\<^sub>F w in at 0. f w \<noteq> 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 976 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 977 | have "(\<lambda>_. 0) has_laurent_expansion 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 978 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 979 | also have "?this \<longleftrightarrow> f has_laurent_expansion 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 980 | using False by (intro has_laurent_expansion_cong) (auto simp: frequently_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 981 | finally show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 982 | using False by (simp add: laurent_expansion_def frequently_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 983 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 984 | case True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 985 | define n where "n = zorder f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 986 | obtain r where r: "zor_poly f 0 0 \<noteq> 0" "zor_poly f 0 holomorphic_on cball 0 r" "r > 0" | 
| 77322 
9c295f84d55f
Replacing  z powr of_int i  by  z powi i   and adding new material from the AFP
 paulson <lp15@cam.ac.uk> parents: 
77277diff
changeset | 987 |                     "\<forall>w\<in>cball 0 r - {0}. f w = zor_poly f 0 w * w powi n \<and>
 | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 988 | zor_poly f 0 w \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 989 | using zorder_exist[OF assms True] unfolding n_def by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 990 | have holo: "zor_poly f 0 holomorphic_on ball 0 r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 991 | by (rule holomorphic_on_subset[OF r(2)]) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 992 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 993 | define F where "F = fps_expansion (zor_poly f 0) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 994 | have F: "zor_poly f 0 has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 995 | unfolding F_def by (rule has_fps_expansion_fps_expansion[OF _ _ holo]) (use \<open>r > 0\<close> in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 996 | have "(\<lambda>z. zor_poly f 0 z * z powi n) has_laurent_expansion fls_shift (-n) (fps_to_fls F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 997 | by (intro laurent_expansion_intros has_laurent_expansion_fps[OF F]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 998 | also have "?this \<longleftrightarrow> f has_laurent_expansion fls_shift (-n) (fps_to_fls F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 999 | by (intro has_laurent_expansion_cong refl eventually_mono[OF eventually_at_in_open[of "ball 0 r"]]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1000 | (use r in \<open>auto simp: complex_powr_of_int\<close>) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1001 | finally show ?thesis using True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1002 | by (simp add: laurent_expansion_def F_def n_def frequently_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1003 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1004 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1005 | lemma not_essential_has_laurent_expansion: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1006 | assumes "isolated_singularity_at f z" "not_essential f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1007 | shows "(\<lambda>x. f (z + x)) has_laurent_expansion laurent_expansion f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1008 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1009 | from assms(1) have iso:"isolated_singularity_at (\<lambda>x. f (z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1010 | by (simp add: isolated_singularity_at_shift_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1011 | moreover from assms(2) have ness:"not_essential (\<lambda>x. f (z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1012 | by (simp add: not_essential_shift_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1013 | ultimately have "(\<lambda>x. f (z + x)) has_laurent_expansion laurent_expansion (\<lambda>x. f (z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1014 | by (rule not_essential_has_laurent_expansion_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1015 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1016 | also have "\<dots> = laurent_expansion f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1017 | proof (cases "\<exists>\<^sub>F w in at z. f w \<noteq> 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1018 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1019 | then have "\<forall>\<^sub>F w in at z. f w = 0" using not_frequently by force | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1020 | then have "laurent_expansion (\<lambda>x. f (z + x)) 0 = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1021 | by (smt (verit, best) add.commute eventually_at_to_0 eventually_mono | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1022 | laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1023 | moreover have "laurent_expansion f z = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1024 | using \<open>\<forall>\<^sub>F w in at z. f w = 0\<close> unfolding laurent_expansion_def by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1025 | ultimately show ?thesis by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1026 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1027 | case True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1028 | define df where "df=zor_poly (\<lambda>x. f (z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1029 | define g where "g=(\<lambda>u. u-z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1030 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1031 | have "fps_expansion df 0 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1032 | = fps_expansion (df o g) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1033 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1034 | have "\<exists>\<^sub>F w in at 0. f (z + w) \<noteq> 0" using True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1035 | by (smt (verit, best) add.commute eventually_at_to_0 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1036 | eventually_mono not_frequently) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1037 | from zorder_exist[OF iso ness this,folded df_def] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1038 | obtain r where "r>0" and df_holo:"df holomorphic_on cball 0 r" and "df 0 \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1039 |           "\<forall>w\<in>cball 0 r - {0}.
 | 
| 77322 
9c295f84d55f
Replacing  z powr of_int i  by  z powi i   and adding new material from the AFP
 paulson <lp15@cam.ac.uk> parents: 
77277diff
changeset | 1040 | f (z + w) = df w * w powi (zorder (\<lambda>w. f (z + w)) 0) \<and> | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1041 | df w \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1042 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1043 | then have df_nz:"\<forall>w\<in>ball 0 r. df w\<noteq>0" by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1044 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1045 | have "(deriv ^^ n) df 0 = (deriv ^^ n) (df \<circ> g) z" for n | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1046 | unfolding comp_def g_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1047 | proof (subst higher_deriv_compose_linear'[where u=1 and c="-z",simplified]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1048 | show "df holomorphic_on ball 0 r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1049 | using df_holo by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1050 | show "open (ball z r)" "open (ball 0 r)" "z \<in> ball z r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1051 | using \<open>r>0\<close> by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1052 | show " \<And>w. w \<in> ball z r \<Longrightarrow> w - z \<in> ball 0 r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1053 | by (simp add: dist_norm) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1054 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1055 | then show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1056 | unfolding fps_expansion_def by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1057 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1058 | also have "... = fps_expansion (zor_poly f z) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1059 | proof (rule fps_expansion_cong) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1060 | have "\<forall>\<^sub>F w in nhds z. zor_poly f z w | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1061 | = zor_poly (\<lambda>u. f (z + u)) 0 (w - z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1062 | apply (rule zor_poly_shift) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1063 | using True assms by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1064 | then show "\<forall>\<^sub>F w in nhds z. (df \<circ> g) w = zor_poly f z w" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1065 | unfolding df_def g_def comp_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1066 | by (auto elim:eventually_mono) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1067 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1068 | finally show ?thesis unfolding df_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1069 | by (auto simp: laurent_expansion_def at_to_0[of z] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1070 | eventually_filtermap add_ac zorder_shift') | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1071 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1072 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1073 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1074 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1075 | lemma has_fps_expansion_to_laurent: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1076 | "f has_fps_expansion F \<longleftrightarrow> f has_laurent_expansion fps_to_fls F \<and> f 0 = fps_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1077 | proof safe | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1078 | assume *: "f has_laurent_expansion fps_to_fls F" "f 0 = fps_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1079 | have "eventually (\<lambda>z. z \<in> eball 0 (fps_conv_radius F)) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1080 | using * by (intro eventually_nhds_in_open) (auto simp: has_laurent_expansion_def zero_ereal_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1081 | moreover have "eventually (\<lambda>z. z \<noteq> 0 \<longrightarrow> eval_fls (fps_to_fls F) z = f z) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1082 | using * by (auto simp: has_laurent_expansion_def eventually_at_filter) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1083 | ultimately have "eventually (\<lambda>z. f z = eval_fps F z) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1084 | by eventually_elim | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1085 | (auto simp: has_laurent_expansion_def eventually_at_filter eval_fps_at_0 eval_fps_to_fls *(2)) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1086 | thus "f has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1087 | using * by (auto simp: has_fps_expansion_def has_laurent_expansion_def eq_commute) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1088 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1089 | assume "f has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1090 | thus "f 0 = fps_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1091 | by (metis eval_fps_at_0 has_fps_expansion_imp_holomorphic) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1092 | qed (auto intro: has_laurent_expansion_fps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1093 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1094 | lemma eval_fps_fls_base_factor [simp]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1095 | assumes "z \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1096 | shows "eval_fps (fls_base_factor_to_fps F) z = eval_fls F z * z powi -fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1097 | using assms unfolding eval_fls_def by (simp add: power_int_minus field_simps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1098 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1099 | lemma has_fps_expansion_imp_analytic_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1100 | assumes "f has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1101 |   shows   "f analytic_on {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1102 | by (meson analytic_at_two assms has_fps_expansion_imp_holomorphic) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1103 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1104 | lemma has_fps_expansion_imp_analytic: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1105 | assumes "(\<lambda>x. f (z + x)) has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1106 |   shows   "f analytic_on {z}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1107 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1108 |   have "(\<lambda>x. f (z + x)) analytic_on {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1109 | by (rule has_fps_expansion_imp_analytic_0) fact | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1110 |   hence "(\<lambda>x. f (z + x)) \<circ> (\<lambda>x. x - z) analytic_on {z}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1111 | by (intro analytic_on_compose_gen analytic_intros) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1112 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1113 | by (simp add: o_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1114 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1115 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1116 | lemma is_pole_cong_asymp_equiv: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1117 | assumes "f \<sim>[at z] g" "z = z'" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1118 | shows "is_pole f z = is_pole g z'" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1119 | using asymp_equiv_at_infinity_transfer[OF assms(1)] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1120 | asymp_equiv_at_infinity_transfer[OF asymp_equiv_symI[OF assms(1)]] assms(2) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1121 | unfolding is_pole_def by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1122 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1123 | lemma not_is_pole_const [simp]: "\<not>is_pole (\<lambda>_::'a::perfect_space. c :: complex) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1124 | using not_tendsto_and_filterlim_at_infinity[of "at z" "\<lambda>_::'a. c" c] by (auto simp: is_pole_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1125 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1126 | lemma has_laurent_expansion_imp_is_pole_iff: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1127 | assumes F: "(\<lambda>x. f (z + x)) has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1128 | shows "is_pole f z \<longleftrightarrow> fls_subdegree F < 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1129 | proof | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1130 | assume pole: "is_pole f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1131 | have [simp]: "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1132 | proof | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1133 | assume "F = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1134 | hence "is_pole f z \<longleftrightarrow> is_pole (\<lambda>_. 0 :: complex) z" using assms | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1135 | by (intro is_pole_cong) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1136 | (auto simp: has_laurent_expansion_def at_to_0[of z] eventually_filtermap add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1137 | with pole show False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1138 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1139 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1140 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1141 | note pole | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1142 | also have "is_pole f z \<longleftrightarrow> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1143 | is_pole (\<lambda>w. fls_nth F (fls_subdegree F) * (w - z) powi fls_subdegree F) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1144 | using has_laurent_expansion_imp_asymp_equiv[OF F] by (intro is_pole_cong_asymp_equiv refl) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1145 | also have "\<dots> \<longleftrightarrow> is_pole (\<lambda>w. (w - z) powi fls_subdegree F) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1146 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1147 | finally have pole': \<dots> . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1148 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1149 | have False if "fls_subdegree F \<ge> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1150 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1151 | have "(\<lambda>w. (w - z) powi fls_subdegree F) holomorphic_on UNIV" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1152 | using that by (intro holomorphic_intros) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1153 | hence "\<not>is_pole (\<lambda>w. (w - z) powi fls_subdegree F) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1154 | by (meson UNIV_I not_is_pole_holomorphic open_UNIV) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1155 | with pole' show False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1156 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1157 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1158 | thus "fls_subdegree F < 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1159 | by force | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1160 | qed (use has_laurent_expansion_imp_is_pole[OF assms] in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1161 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1162 | lemma analytic_at_imp_has_fps_expansion_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1163 |   assumes "f analytic_on {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1164 | shows "f has_fps_expansion fps_expansion f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1165 | using assms has_fps_expansion_fps_expansion analytic_at by fast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1166 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1167 | lemma deriv_shift_0: "deriv f z = deriv (f \<circ> (\<lambda>x. z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1168 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1169 | have *: "(f \<circ> (+) z has_field_derivative D) (at z')" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1170 | if "(f has_field_derivative D) (at (z + z'))" for D z z' and f :: "'a \<Rightarrow> 'a" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1171 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1172 | have "(f \<circ> (+) z has_field_derivative D * 1) (at z')" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1173 | by (rule DERIV_chain that derivative_eq_intros refl)+ auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1174 | thus ?thesis by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1175 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1176 | have "(\<lambda>D. (f has_field_derivative D) (at z)) = (\<lambda> D. (f \<circ> (+) z has_field_derivative D) (at 0))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1177 | using *[of f _ z 0] *[of "f \<circ> (+) z" _ "-z" z] by (intro ext iffI) (auto simp: o_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1178 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1179 | by (simp add: deriv_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1180 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1181 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1182 | lemma deriv_shift_0': "NO_MATCH 0 z \<Longrightarrow> deriv f z = deriv (f \<circ> (\<lambda>x. z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1183 | by (rule deriv_shift_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1184 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1185 | lemma higher_deriv_shift_0: "(deriv ^^ n) f z = (deriv ^^ n) (f \<circ> (\<lambda>x. z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1186 | proof (induction n arbitrary: f) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1187 | case (Suc n) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1188 | have "(deriv ^^ Suc n) f z = (deriv ^^ n) (deriv f) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1189 | by (subst funpow_Suc_right) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1190 | also have "\<dots> = (deriv ^^ n) (\<lambda>x. deriv f (z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1191 | by (subst Suc) (auto simp: o_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1192 | also have "\<dots> = (deriv ^^ n) (\<lambda>x. deriv (\<lambda>xa. f (z + x + xa)) 0) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1193 | by (subst deriv_shift_0) (auto simp: o_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1194 | also have "(\<lambda>x. deriv (\<lambda>xa. f (z + x + xa)) 0) = deriv (\<lambda>x. f (z + x))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1195 | by (rule ext) (simp add: deriv_shift_0' o_def add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1196 | also have "(deriv ^^ n) \<dots> 0 = (deriv ^^ Suc n) (f \<circ> (\<lambda>x. z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1197 | by (subst funpow_Suc_right) (auto simp: o_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1198 | finally show ?case . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1199 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1200 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1201 | lemma higher_deriv_shift_0': "NO_MATCH 0 z \<Longrightarrow> (deriv ^^ n) f z = (deriv ^^ n) (f \<circ> (\<lambda>x. z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1202 | by (rule higher_deriv_shift_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1203 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1204 | lemma analytic_at_imp_has_fps_expansion: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1205 |   assumes "f analytic_on {z}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1206 | shows "(\<lambda>x. f (z + x)) has_fps_expansion fps_expansion f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1207 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1208 |   have "f \<circ> (\<lambda>x. z + x) analytic_on {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1209 | by (intro analytic_on_compose_gen[OF _ assms] analytic_intros) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1210 | hence "(f \<circ> (\<lambda>x. z + x)) has_fps_expansion fps_expansion (f \<circ> (\<lambda>x. z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1211 | unfolding o_def by (intro analytic_at_imp_has_fps_expansion_0) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1212 | also have "\<dots> = fps_expansion f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1213 | by (simp add: fps_expansion_def higher_deriv_shift_0') | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1214 | finally show ?thesis by (simp add: add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1215 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1216 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1217 | lemma has_laurent_expansion_zorder_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1218 | assumes "f has_laurent_expansion F" "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1219 | shows "zorder f 0 = fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1220 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1221 | define G where "G = fls_base_factor_to_fps F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1222 |   from assms obtain A where A: "0 \<in> A" "open A" "\<And>x. x \<in> A - {0} \<Longrightarrow> eval_fls F x = f x"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1223 | unfolding has_laurent_expansion_def eventually_at_filter eventually_nhds | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1224 | by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1225 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1226 | show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1227 | proof (rule zorder_eqI) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1228 | show "open (A \<inter> eball 0 (fls_conv_radius F))" "0 \<in> A \<inter> eball 0 (fls_conv_radius F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1229 | using assms A by (auto simp: has_laurent_expansion_def zero_ereal_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1230 | show "eval_fps G holomorphic_on A \<inter> eball 0 (fls_conv_radius F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1231 | by (intro holomorphic_intros) (auto simp: fls_conv_radius_altdef G_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1232 | show "eval_fps G 0 \<noteq> 0" using \<open>F \<noteq> 0\<close> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1233 | by (auto simp: eval_fps_at_0 G_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1234 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1235 | fix w :: complex assume "w \<in> A \<inter> eball 0 (fls_conv_radius F)" "w \<noteq> 0" | 
| 77322 
9c295f84d55f
Replacing  z powr of_int i  by  z powi i   and adding new material from the AFP
 paulson <lp15@cam.ac.uk> parents: 
77277diff
changeset | 1236 | thus "f w = eval_fps G w * (w - 0) powi (fls_subdegree F)" | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1237 | using A unfolding G_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1238 | by (subst eval_fps_fls_base_factor) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1239 | (auto simp: complex_powr_of_int power_int_minus field_simps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1240 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1241 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1242 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1243 | lemma has_laurent_expansion_zorder: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1244 | assumes "(\<lambda>w. f (z + w)) has_laurent_expansion F" "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1245 | shows "zorder f z = fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1246 | using has_laurent_expansion_zorder_0[OF assms] by (simp add: zorder_shift' add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1247 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1248 | lemma has_fps_expansion_zorder_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1249 | assumes "f has_fps_expansion F" "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1250 | shows "zorder f 0 = int (subdegree F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1251 | using assms has_laurent_expansion_zorder_0[of f "fps_to_fls F"] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1252 | by (auto simp: has_fps_expansion_to_laurent fls_subdegree_fls_to_fps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1253 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1254 | lemma has_fps_expansion_zorder: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1255 | assumes "(\<lambda>w. f (z + w)) has_fps_expansion F" "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1256 | shows "zorder f z = int (subdegree F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1257 | using has_fps_expansion_zorder_0[OF assms] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1258 | by (simp add: zorder_shift' add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1259 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1260 | lemma has_fps_expansion_fls_base_factor_to_fps: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1261 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1262 | defines "n \<equiv> fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1263 | defines "c \<equiv> fps_nth (fls_base_factor_to_fps F) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1264 | shows "(\<lambda>z. if z = 0 then c else f z * z powi -n) has_fps_expansion fls_base_factor_to_fps F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1265 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1266 | have "(\<lambda>z. f z * z powi -n) has_laurent_expansion fls_shift (-(-n)) F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1267 | by (intro laurent_expansion_intros assms) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1268 | also have "fls_shift (-(-n)) F = fps_to_fls (fls_base_factor_to_fps F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1269 | by (simp add: n_def fls_shift_nonneg_subdegree) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1270 | also have "(\<lambda>z. f z * z powi - n) has_laurent_expansion fps_to_fls (fls_base_factor_to_fps F) \<longleftrightarrow> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1271 | (\<lambda>z. if z = 0 then c else f z * z powi -n) has_laurent_expansion fps_to_fls (fls_base_factor_to_fps F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1272 | by (intro has_laurent_expansion_cong) (auto simp: eventually_at_filter) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1273 | also have "\<dots> \<longleftrightarrow> (\<lambda>z. if z = 0 then c else f z * z powi -n) has_fps_expansion fls_base_factor_to_fps F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1274 | by (subst has_fps_expansion_to_laurent) (auto simp: c_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1275 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1276 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1277 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1278 | lemma zero_has_laurent_expansion_imp_eq_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1279 | assumes "(\<lambda>_. 0) has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1280 | shows "F = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1281 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1282 | have "at (0 :: complex) \<noteq> bot" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1283 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1284 | moreover have "(\<lambda>z. if z = 0 then fls_nth F (fls_subdegree F) else 0) has_fps_expansion | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1285 | fls_base_factor_to_fps F" (is "?f has_fps_expansion _") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1286 | using has_fps_expansion_fls_base_factor_to_fps[OF assms] by (simp cong: if_cong) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1287 | hence "isCont ?f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1288 | using has_fps_expansion_imp_continuous by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1289 | hence "?f \<midarrow>0\<rightarrow> fls_nth F (fls_subdegree F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1290 | by (auto simp: isCont_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1291 | moreover have "?f \<midarrow>0\<rightarrow> 0 \<longleftrightarrow> (\<lambda>_::complex. 0 :: complex) \<midarrow>0\<rightarrow> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1292 | by (intro filterlim_cong) (auto simp: eventually_at_filter) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1293 | hence "?f \<midarrow>0\<rightarrow> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1294 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1295 | ultimately have "fls_nth F (fls_subdegree F) = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1296 | by (rule tendsto_unique) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1297 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1298 | by (meson nth_fls_subdegree_nonzero) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1299 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1300 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1301 | lemma has_laurent_expansion_unique: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1302 | assumes "f has_laurent_expansion F" "f has_laurent_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1303 | shows "F = G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1304 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1305 | from assms have "(\<lambda>x. f x - f x) has_laurent_expansion F - G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1306 | by (intro laurent_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1307 | hence "(\<lambda>_. 0) has_laurent_expansion F - G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1308 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1309 | hence "F - G = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1310 | by (rule zero_has_laurent_expansion_imp_eq_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1311 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1312 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1313 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1314 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1315 | lemma laurent_expansion_eqI: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1316 | assumes "(\<lambda>x. f (z + x)) has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1317 | shows "laurent_expansion f z = F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1318 | using assms has_laurent_expansion_isolated has_laurent_expansion_not_essential | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1319 | has_laurent_expansion_unique not_essential_has_laurent_expansion by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1320 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1321 | lemma laurent_expansion_0_eqI: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1322 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1323 | shows "laurent_expansion f 0 = F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1324 | using assms laurent_expansion_eqI[of f 0] by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1325 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1326 | lemma has_laurent_expansion_nonzero_imp_eventually_nonzero: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1327 | assumes "f has_laurent_expansion F" "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1328 | shows "eventually (\<lambda>x. f x \<noteq> 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1329 | proof (rule ccontr) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1330 | assume "\<not>eventually (\<lambda>x. f x \<noteq> 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1331 | with assms have "eventually (\<lambda>x. f x = 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1332 | by (intro not_essential_frequently_0_imp_eventually_0 has_laurent_expansion_isolated | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1333 | has_laurent_expansion_not_essential) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1334 | (auto simp: frequently_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1335 | hence "(f has_laurent_expansion 0) \<longleftrightarrow> ((\<lambda>_. 0) has_laurent_expansion 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1336 | by (intro has_laurent_expansion_cong) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1337 | hence "f has_laurent_expansion 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1338 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1339 | with assms(1) have "F = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1340 | using has_laurent_expansion_unique by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1341 | with \<open>F \<noteq> 0\<close> show False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1342 | by contradiction | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1343 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1344 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1345 | lemma has_laurent_expansion_eventually_nonzero_iff': | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1346 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1347 | shows "eventually (\<lambda>x. f x \<noteq> 0) (at 0) \<longleftrightarrow> F \<noteq> 0 " | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1348 | proof | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1349 | assume "\<forall>\<^sub>F x in at 0. f x \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1350 | moreover have "\<not> (\<forall>\<^sub>F x in at 0. f x \<noteq> 0)" if "F=0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1351 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1352 | have "\<forall>\<^sub>F x in at 0. f x = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1353 | using assms that unfolding has_laurent_expansion_def by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1354 | then show ?thesis unfolding not_eventually | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1355 | by (auto elim:eventually_frequentlyE) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1356 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1357 | ultimately show "F \<noteq> 0" by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1358 | qed (simp add:has_laurent_expansion_nonzero_imp_eventually_nonzero[OF assms]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1359 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1360 | lemma has_laurent_expansion_eventually_nonzero_iff: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1361 | assumes "(\<lambda>w. f (z+w)) has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1362 | shows "eventually (\<lambda>x. f x \<noteq> 0) (at z) \<longleftrightarrow> F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1363 | apply (subst eventually_at_to_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1364 | apply (rule has_laurent_expansion_eventually_nonzero_iff') | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1365 | using assms by (simp add:add.commute) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1366 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1367 | lemma has_laurent_expansion_inverse [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1368 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1369 | shows "(\<lambda>x. inverse (f x)) has_laurent_expansion inverse F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1370 | proof (cases "F = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1371 | case True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1372 | thus ?thesis using assms | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1373 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1374 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1375 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1376 | define G where "G = laurent_expansion (\<lambda>x. inverse (f x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1377 | from False have ev: "eventually (\<lambda>z. f z \<noteq> 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1378 | by (intro has_laurent_expansion_nonzero_imp_eventually_nonzero[OF assms]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1379 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1380 | have *: "(\<lambda>x. inverse (f x)) has_laurent_expansion G" unfolding G_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1381 | by (intro not_essential_has_laurent_expansion_0 isolated_singularity_at_inverse not_essential_inverse | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1382 | has_laurent_expansion_isolated_0[OF assms] has_laurent_expansion_not_essential_0[OF assms]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1383 | have "(\<lambda>x. f x * inverse (f x)) has_laurent_expansion F * G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1384 | by (intro laurent_expansion_intros assms *) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1385 | also have "?this \<longleftrightarrow> (\<lambda>x. 1) has_laurent_expansion F * G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1386 | by (intro has_laurent_expansion_cong refl eventually_mono[OF ev]) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1387 | finally have "(\<lambda>_. 1) has_laurent_expansion F * G" . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1388 | moreover have "(\<lambda>_. 1) has_laurent_expansion 1" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1389 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1390 | ultimately have "F * G = 1" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1391 | using has_laurent_expansion_unique by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1392 | hence "G = inverse F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1393 | using inverse_unique by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1394 | with * show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1395 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1396 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1397 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1398 | lemma has_laurent_expansion_power_int [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1399 | "f has_laurent_expansion F \<Longrightarrow> (\<lambda>x. f x powi n) has_laurent_expansion (F powi n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1400 | by (auto simp: power_int_def intro!: laurent_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1401 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1402 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1403 | lemma has_fps_expansion_0_analytic_continuation: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1404 | assumes "f has_fps_expansion 0" "f holomorphic_on A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1405 | assumes "open A" "connected A" "0 \<in> A" "x \<in> A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1406 | shows "f x = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1407 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1408 | have "eventually (\<lambda>z. z \<in> A \<and> f z = 0) (nhds 0)" using assms | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1409 | by (intro eventually_conj eventually_nhds_in_open) (auto simp: has_fps_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1410 | then obtain B where B: "open B" "0 \<in> B" "\<forall>z\<in>B. z \<in> A \<and> f z = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1411 | unfolding eventually_nhds by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1412 | show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1413 | proof (rule analytic_continuation_open[where f = f and g = "\<lambda>_. 0"]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1414 |     show "B \<noteq> {}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1415 | using \<open>open B\<close> B by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1416 | show "connected A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1417 | using assms by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1418 | qed (use assms B in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1419 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1420 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1421 | lemma has_laurent_expansion_0_analytic_continuation: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1422 |   assumes "f has_laurent_expansion 0" "f holomorphic_on A - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1423 |   assumes "open A" "connected A" "0 \<in> A" "x \<in> A - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1424 | shows "f x = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1425 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1426 |   have "eventually (\<lambda>z. z \<in> A - {0} \<and> f z = 0) (at 0)" using assms
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1427 | by (intro eventually_conj eventually_at_in_open) (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1428 |   then obtain B where B: "open B" "0 \<in> B" "\<forall>z\<in>B - {0}. z \<in> A - {0} \<and> f z = 0"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1429 | unfolding eventually_at_filter eventually_nhds by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1430 | show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1431 | proof (rule analytic_continuation_open[where f = f and g = "\<lambda>_. 0"]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1432 |     show "B - {0} \<noteq> {}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1433 | using \<open>open B\<close> \<open>0 \<in> B\<close> by (metis insert_Diff not_open_singleton) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1434 |     show "connected (A - {0})"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1435 | using assms by (intro connected_open_delete) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1436 | qed (use assms B in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1437 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1438 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1439 | lemma has_fps_expansion_cong: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1440 | assumes "eventually (\<lambda>x. f x = g x) (nhds 0)" "F = G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1441 | shows "f has_fps_expansion F \<longleftrightarrow> g has_fps_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1442 | using assms(2) by (auto simp: has_fps_expansion_def elim!: eventually_elim2[OF assms(1)]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1443 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1444 | lemma zor_poly_has_fps_expansion: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1445 | assumes "f has_laurent_expansion F" "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1446 | shows "zor_poly f 0 has_fps_expansion fls_base_factor_to_fps F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1447 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1448 | note [simp] = \<open>F \<noteq> 0\<close> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1449 | have "eventually (\<lambda>z. f z \<noteq> 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1450 | by (rule has_laurent_expansion_nonzero_imp_eventually_nonzero[OF assms]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1451 | hence freq: "frequently (\<lambda>z. f z \<noteq> 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1452 | by (rule eventually_frequently[rotated]) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1453 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1454 | have *: "isolated_singularity_at f 0" "not_essential f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1455 | using has_laurent_expansion_isolated_0[OF assms(1)] has_laurent_expansion_not_essential_0[OF assms(1)] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1456 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1457 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1458 | define G where "G = fls_base_factor_to_fps F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1459 | define n where "n = zorder f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1460 | have n_altdef: "n = fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1461 | using has_laurent_expansion_zorder_0 [OF assms(1)] by (simp add: n_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1462 | obtain r where r: "zor_poly f 0 0 \<noteq> 0" "zor_poly f 0 holomorphic_on cball 0 r" "r > 0" | 
| 77322 
9c295f84d55f
Replacing  z powr of_int i  by  z powi i   and adding new material from the AFP
 paulson <lp15@cam.ac.uk> parents: 
77277diff
changeset | 1463 |                     "\<forall>w\<in>cball 0 r - {0}. f w = zor_poly f 0 w * w powi n \<and>
 | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1464 | zor_poly f 0 w \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1465 | using zorder_exist[OF * freq] unfolding n_def by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1466 |   obtain r' where r': "r' > 0" "\<forall>x\<in>ball 0 r'-{0}. eval_fls F x = f x"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1467 | using assms(1) unfolding has_laurent_expansion_def eventually_at_filter eventually_nhds_metric ball_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1468 | by (auto simp: dist_commute) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1469 | have holo: "zor_poly f 0 holomorphic_on ball 0 r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1470 | by (rule holomorphic_on_subset[OF r(2)]) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1471 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1472 | have "(\<lambda>z. if z = 0 then fps_nth G 0 else f z * z powi -n) has_fps_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1473 | unfolding G_def n_altdef by (intro has_fps_expansion_fls_base_factor_to_fps assms) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1474 | also have "?this \<longleftrightarrow> zor_poly f 0 has_fps_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1475 | proof (intro has_fps_expansion_cong) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1476 | have "eventually (\<lambda>z. z \<in> ball 0 (min r r')) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1477 | using \<open>r > 0\<close> \<open>r' > 0\<close> by (intro eventually_nhds_in_open) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1478 | thus "\<forall>\<^sub>F x in nhds 0. (if x = 0 then G $ 0 else f x * x powi - n) = zor_poly f 0 x" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1479 | proof eventually_elim | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1480 | case (elim w) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1481 | have w: "w \<in> ball 0 r" "w \<in> ball 0 r'" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1482 | using elim by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1483 | show ?case | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1484 | proof (cases "w = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1485 | case False | 
| 77322 
9c295f84d55f
Replacing  z powr of_int i  by  z powi i   and adding new material from the AFP
 paulson <lp15@cam.ac.uk> parents: 
77277diff
changeset | 1486 | hence "f w = zor_poly f 0 w * w powi n" | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1487 | using r w by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1488 | thus ?thesis using False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1489 | by (simp add: powr_minus complex_powr_of_int power_int_minus) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1490 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1491 | case [simp]: True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1492 | obtain R where R: "R > 0" "R \<le> r" "R \<le> r'" "R \<le> fls_conv_radius F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1493 | using \<open>r > 0\<close> \<open>r' > 0\<close> assms(1) unfolding has_laurent_expansion_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1494 | by (smt (verit, ccfv_SIG) ereal_dense2 ereal_less(2) less_ereal.simps(1) order.strict_implies_order order_trans) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1495 | have "eval_fps G 0 = zor_poly f 0 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1496 | proof (rule analytic_continuation_open[where f = "eval_fps G" and g = "zor_poly f 0"]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1497 | show "connected (ball 0 R :: complex set)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1498 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1499 |           have "of_real R / 2 \<in> ball 0 R - {0 :: complex}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1500 | using R by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1501 |           thus "ball 0 R - {0 :: complex} \<noteq> {}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1502 | by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1503 | show "eval_fps G holomorphic_on ball 0 R" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1504 | using R less_le_trans[OF _ R(4)] unfolding G_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1505 | by (intro holomorphic_intros) (auto simp: fls_conv_radius_altdef) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1506 | show "zor_poly f 0 holomorphic_on ball 0 R" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1507 | by (rule holomorphic_on_subset[OF holo]) (use R in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1508 |           show "eval_fps G z = zor_poly f 0 z" if "z \<in> ball 0 R - {0}" for z
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1509 | using that r r' R n_altdef unfolding G_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1510 | by (subst eval_fps_fls_base_factor) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1511 | (auto simp: complex_powr_of_int field_simps power_int_minus n_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1512 | qed (use R in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1513 | hence "zor_poly f 0 0 = fps_nth G 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1514 | by (simp add: eval_fps_at_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1515 | thus ?thesis by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1516 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1517 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1518 | qed (use r' in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1519 | finally show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1520 | by (simp add: G_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1521 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1522 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1523 | lemma zorder_geI_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1524 |   assumes "f analytic_on {0}" "f holomorphic_on A" "open A" "connected A" "0 \<in> A" "z \<in> A" "f z \<noteq> 0"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1525 | assumes "\<And>k. k < n \<Longrightarrow> (deriv ^^ k) f 0 = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1526 | shows "zorder f 0 \<ge> n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1527 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1528 | define F where "F = fps_expansion f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1529 | from assms have "f has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1530 | unfolding F_def using analytic_at_imp_has_fps_expansion_0 by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1531 | hence laurent: "f has_laurent_expansion fps_to_fls F" and [simp]: "f 0 = fps_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1532 | by (simp_all add: has_fps_expansion_to_laurent) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1533 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1534 | have [simp]: "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1535 | proof | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1536 | assume [simp]: "F = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1537 | hence "f z = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1538 | proof (cases "z = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1539 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1540 | have "f has_laurent_expansion 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1541 | using laurent by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1542 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1543 | proof (rule has_laurent_expansion_0_analytic_continuation) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1544 |         show "f holomorphic_on A - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1545 | using assms(2) by (rule holomorphic_on_subset) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1546 | qed (use assms False in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1547 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1548 | with \<open>f z \<noteq> 0\<close> show False by contradiction | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1549 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1550 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1551 | have "zorder f 0 = int (subdegree F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1552 | using has_laurent_expansion_zorder_0[OF laurent] by (simp add: fls_subdegree_fls_to_fps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1553 | also have "subdegree F \<ge> n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1554 | using assms by (intro subdegree_geI \<open>F \<noteq> 0\<close>) (auto simp: F_def fps_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1555 | hence "int (subdegree F) \<ge> int n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1556 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1557 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1558 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1559 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1560 | lemma zorder_geI: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1561 |   assumes "f analytic_on {x}" "f holomorphic_on A" "open A" "connected A" "x \<in> A" "z \<in> A" "f z \<noteq> 0"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1562 | assumes "\<And>k. k < n \<Longrightarrow> (deriv ^^ k) f x = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1563 | shows "zorder f x \<ge> n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1564 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1565 | have "zorder f x = zorder (f \<circ> (\<lambda>u. u + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1566 | by (subst zorder_shift) (auto simp: o_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1567 | also have "\<dots> \<ge> n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1568 | proof (rule zorder_geI_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1569 |     show "(f \<circ> (\<lambda>u. u + x)) analytic_on {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1570 | by (intro analytic_on_compose_gen[OF _ assms(1)] analytic_intros) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1571 | show "f \<circ> (\<lambda>u. u + x) holomorphic_on ((+) (-x)) ` A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1572 | by (intro holomorphic_on_compose_gen[OF _ assms(2)] holomorphic_intros) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1573 | show "connected ((+) (- x) ` A)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1574 | by (intro connected_continuous_image continuous_intros assms) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1575 | show "open ((+) (- x) ` A)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1576 | by (intro open_translation assms) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1577 | show "z - x \<in> (+) (- x) ` A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1578 | using \<open>z \<in> A\<close> by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1579 | show "0 \<in> (+) (- x) ` A" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1580 | using \<open>x \<in> A\<close> by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1581 | show "(f \<circ> (\<lambda>u. u + x)) (z - x) \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1582 | using \<open>f z \<noteq> 0\<close> by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1583 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1584 | fix k :: nat assume "k < n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1585 | hence "(deriv ^^ k) f x = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1586 | using assms by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1587 | also have "(deriv ^^ k) f x = (deriv ^^ k) (f \<circ> (+) x) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1588 | by (subst higher_deriv_shift_0) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1589 | finally show "(deriv ^^ k) (f \<circ> (\<lambda>u. u + x)) 0 = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1590 | by (subst add.commute) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1591 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1592 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1593 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1594 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1595 | lemma has_laurent_expansion_divide [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1596 | assumes "f has_laurent_expansion F" and "g has_laurent_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1597 | shows "(\<lambda>x. f x / g x) has_laurent_expansion (F / G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1598 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1599 | have "(\<lambda>x. f x * inverse (g x)) has_laurent_expansion (F * inverse G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1600 | by (intro laurent_expansion_intros assms) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1601 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1602 | by (simp add: field_simps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1603 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1604 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1605 | lemma vector_derivative_translate [simp]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1606 | "vector_derivative ((+) z \<circ> g) (at x within A) = vector_derivative g (at x within A)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1607 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1608 | have "(((+) z \<circ> g) has_vector_derivative g') (at x within A)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1609 | if "(g has_vector_derivative g') (at x within A)" for g :: "real \<Rightarrow> 'a" and z g' | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1610 | unfolding o_def using that by (auto intro!: derivative_eq_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1611 | from this[of g _ z] this[of "\<lambda>x. z + g x" _ "-z"] show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1612 | unfolding vector_derivative_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1613 | by (intro arg_cong[where f = Eps] ext) (auto simp: o_def algebra_simps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1614 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1615 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1616 | lemma has_contour_integral_translate: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1617 | "(f has_contour_integral I) ((+) z \<circ> g) \<longleftrightarrow> ((\<lambda>x. f (x + z)) has_contour_integral I) g" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1618 | by (simp add: has_contour_integral_def add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1619 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1620 | lemma contour_integrable_translate: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1621 | "f contour_integrable_on ((+) z \<circ> g) \<longleftrightarrow> (\<lambda>x. f (x + z)) contour_integrable_on g" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1622 | by (simp add: contour_integrable_on_def has_contour_integral_translate) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1623 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1624 | lemma contour_integral_translate: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1625 | "contour_integral ((+) z \<circ> g) f = contour_integral g (\<lambda>x. f (x + z))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1626 | by (simp add: contour_integral_def contour_integrable_translate has_contour_integral_translate) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1627 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1628 | lemma residue_shift_0: "residue f z = residue (\<lambda>x. f (z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1629 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1630 | define Q where | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1631 | "Q = (\<lambda>r f z \<epsilon>. (f has_contour_integral complex_of_real (2 * pi) * \<i> * r) (circlepath z \<epsilon>))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1632 | define P where | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1633 | "P = (\<lambda>r f z. \<exists>e>0. \<forall>\<epsilon>>0. \<epsilon> < e \<longrightarrow> Q r f z \<epsilon>)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1634 | have path_eq: "circlepath (z - w) \<epsilon> = (+) (-w) \<circ> circlepath z \<epsilon>" for z w \<epsilon> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1635 | by (simp add: circlepath_def o_def part_circlepath_def algebra_simps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1636 | have *: "P r f z" if "P r (\<lambda>x. f (x + w)) (z - w)" for r w f z | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1637 | using that by (auto simp: P_def Q_def path_eq has_contour_integral_translate) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1638 | have "(SOME r. P r f z) = (SOME r. P r (\<lambda>x. f (z + x)) 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1639 | using *[of _ f z z] *[of _ "\<lambda>x. f (z + x)" "-z"] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1640 | by (intro arg_cong[where f = Eps] ext iffI) (simp_all add: add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1641 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1642 | by (simp add: residue_def P_def Q_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1643 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1644 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1645 | lemma residue_shift_0': "NO_MATCH 0 z \<Longrightarrow> residue f z = residue (\<lambda>x. f (z + x)) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1646 | by (rule residue_shift_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1647 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1648 | lemma has_laurent_expansion_residue_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1649 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1650 | shows "residue f 0 = fls_residue F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1651 | proof (cases "fls_subdegree F \<ge> 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1652 | case True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1653 | have "residue f 0 = residue (eval_fls F) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1654 | using assms by (intro residue_cong) (auto simp: has_laurent_expansion_def eq_commute) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1655 | also have "\<dots> = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1656 | by (rule residue_holo[OF _ _ holomorphic_on_eval_fls[OF order.refl]]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1657 | (use True assms in \<open>auto simp: has_laurent_expansion_def zero_ereal_def\<close>) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1658 | also have "\<dots> = fls_residue F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1659 | using True by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1660 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1661 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1662 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1663 | hence "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1664 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1665 | have *: "zor_poly f 0 has_fps_expansion fls_base_factor_to_fps F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1666 | by (intro zor_poly_has_fps_expansion False assms \<open>F \<noteq> 0\<close>) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1667 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1668 | have "residue f 0 = (deriv ^^ (nat (-zorder f 0) - 1)) (zor_poly f 0) 0 / fact (nat (- zorder f 0) - 1)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1669 | by (intro residue_pole_order has_laurent_expansion_isolated_0[OF assms] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1670 | has_laurent_expansion_imp_is_pole_0[OF assms]) (use False in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1671 | also have "\<dots> = fls_residue F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1672 | using has_laurent_expansion_zorder_0[OF assms \<open>F \<noteq> 0\<close>] False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1673 | by (subst fps_nth_fps_expansion [OF *, symmetric]) (auto simp: of_nat_diff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1674 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1675 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1676 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1677 | lemma has_laurent_expansion_residue: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1678 | assumes "(\<lambda>x. f (z + x)) has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1679 | shows "residue f z = fls_residue F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1680 | using has_laurent_expansion_residue_0[OF assms] by (simp add: residue_shift_0') | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1681 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1682 | lemma eval_fls_has_laurent_expansion [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1683 | assumes "fls_conv_radius F > 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1684 | shows "eval_fls F has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1685 | using assms by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1686 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1687 | lemma fps_expansion_unique_complex: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1688 | fixes F G :: "complex fps" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1689 | assumes "f has_fps_expansion F" "f has_fps_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1690 | shows "F = G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1691 | using assms unfolding fps_eq_iff by (auto simp: fps_eq_iff fps_nth_fps_expansion) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1692 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1693 | lemma fps_expansion_eqI: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1694 | assumes "f has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1695 | shows "fps_expansion f 0 = F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1696 | using assms unfolding fps_eq_iff | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1697 | by (auto simp: fps_eq_iff fps_nth_fps_expansion fps_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1698 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1699 | lemma has_fps_expansion_imp_eval_fps_eq: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1700 | assumes "f has_fps_expansion F" "norm z < r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1701 | assumes "f holomorphic_on ball 0 r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1702 | shows "eval_fps F z = f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1703 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1704 | have [simp]: "fps_expansion f 0 = F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1705 | by (rule fps_expansion_eqI) fact | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1706 | have *: "f holomorphic_on eball 0 (ereal r)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1707 | using assms by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1708 | from conv_radius_fps_expansion[OF *] have "fps_conv_radius F \<ge> ereal r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1709 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1710 | have "eval_fps (fps_expansion f 0) z = f (0 + z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1711 | by (rule eval_fps_expansion'[OF *]) (use assms in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1712 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1713 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1714 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1715 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1716 | lemma fls_conv_radius_ge: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1717 | assumes "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1718 |   assumes "f holomorphic_on eball 0 r - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1719 | shows "fls_conv_radius F \<ge> r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1720 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1721 | define n where "n = fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1722 | define G where "G = fls_base_factor_to_fps F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1723 | define g where "g = (\<lambda>z. if z = 0 then fps_nth G 0 else f z * z powi -n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1724 | have G: "g has_fps_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1725 | unfolding G_def g_def n_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1726 | by (intro has_fps_expansion_fls_base_factor_to_fps assms) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1727 |   have "(\<lambda>z. f z * z powi -n) holomorphic_on eball 0 r - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1728 | by (intro holomorphic_intros assms) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1729 |   also have "?this \<longleftrightarrow> g holomorphic_on eball 0 r - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1730 | by (intro holomorphic_cong) (auto simp: g_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1731 |   finally have "g analytic_on eball 0 r - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1732 | by (subst analytic_on_open) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1733 |   moreover have "g analytic_on {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1734 | using G has_fps_expansion_imp_analytic_0 by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1735 |   ultimately have "g analytic_on (eball 0 r - {0} \<union> {0})"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1736 | by (subst analytic_on_Un) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1737 | hence "g analytic_on eball 0 r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1738 | by (rule analytic_on_subset) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1739 | hence "g holomorphic_on eball 0 r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1740 | by (subst (asm) analytic_on_open) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1741 | hence "fps_conv_radius (fps_expansion g 0) \<ge> r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1742 | by (intro conv_radius_fps_expansion) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1743 | also have "fps_expansion g 0 = G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1744 | using G by (intro fps_expansion_eqI) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1745 | finally show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1746 | by (simp add: fls_conv_radius_altdef G_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1747 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1748 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1749 | lemma connected_eball [intro]: "connected (eball (z :: 'a :: real_normed_vector) r)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1750 | by (cases r) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1751 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1752 | lemma eval_fls_eqI: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1753 |   assumes "f has_laurent_expansion F" "f holomorphic_on eball 0 r - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1754 |   assumes "z \<in> eball 0 r - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1755 | shows "eval_fls F z = f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1756 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1757 | have conv: "fls_conv_radius F \<ge> r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1758 | by (intro fls_conv_radius_ge[OF assms(1,2)]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1759 | have "(\<lambda>z. eval_fls F z - f z) has_laurent_expansion F - F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1760 | using assms by (intro laurent_expansion_intros assms) (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1761 | hence "(\<lambda>z. eval_fls F z - f z) has_laurent_expansion 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1762 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1763 | hence "eval_fls F z - f z = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1764 | proof (rule has_laurent_expansion_0_analytic_continuation) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1765 | have "ereal 0 \<le> ereal (norm z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1766 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1767 | also have "norm z < r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1768 | using assms by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1769 | finally have "r > 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1770 | by (simp add: zero_ereal_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1771 | thus "open (eball 0 r :: complex set)" "connected (eball 0 r :: complex set)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1772 |          "0 \<in> eball 0 r" "z \<in> eball 0 r - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1773 | using assms by (auto simp: zero_ereal_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1774 | qed (auto intro!: holomorphic_intros assms less_le_trans[OF _ conv] split: if_splits) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1775 | thus ?thesis by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1776 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1777 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1778 | lemma fls_nth_as_contour_integral: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1779 | assumes F: "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1780 |   assumes holo: "f holomorphic_on ball 0 r - {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1781 | assumes R: "0 < R" "R < r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1782 | shows "((\<lambda>z. f z * z powi (-(n+1))) has_contour_integral | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1783 | complex_of_real (2 * pi) * \<i> * fls_nth F n) (circlepath 0 R)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1784 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1785 | define I where "I = (\<lambda>z. f z * z powi (-(n+1)))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1786 | have "(I has_contour_integral complex_of_real (2 * pi) * \<i> * residue I 0) (circlepath 0 R)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1787 | proof (rule base_residue) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1788 | show "open (ball (0::complex) r)" "0 \<in> ball (0::complex) r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1789 | using R F by (auto simp: has_laurent_expansion_def zero_ereal_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1790 | qed (use R in \<open>auto intro!: holomorphic_intros holomorphic_on_subset[OF holo] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1791 | simp: I_def split: if_splits\<close>) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1792 | also have "residue I 0 = fls_residue (fls_shift (n + 1) F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1793 | unfolding I_def by (intro has_laurent_expansion_residue_0 laurent_expansion_intros F) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1794 | also have "\<dots> = fls_nth F n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1795 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1796 | finally show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1797 | by (simp add: I_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1798 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1799 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1800 | lemma tendsto_0_subdegree_iff_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1801 | assumes F:"f has_laurent_expansion F" and "F\<noteq>0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1802 | shows "(f \<midarrow>0\<rightarrow>0) \<longleftrightarrow> fls_subdegree F > 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1803 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1804 | have ?thesis if "is_pole f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1805 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1806 | have "fls_subdegree F <0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1807 | using is_pole_0_imp_neg_fls_subdegree[OF F that] . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1808 | moreover then have "\<not> f \<midarrow>0\<rightarrow>0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1809 | using \<open>is_pole f 0\<close> F at_neq_bot | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1810 | has_laurent_expansion_imp_filterlim_infinity_0 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1811 | not_tendsto_and_filterlim_at_infinity that | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1812 | by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1813 | ultimately show ?thesis by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1814 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1815 | moreover have ?thesis if "\<not>is_pole f 0" "\<exists>x. f \<midarrow>0\<rightarrow>x" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1816 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1817 | have "fls_subdegree F \<ge>0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1818 | using has_laurent_expansion_imp_is_pole_0[OF F] that(1) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1819 | by linarith | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1820 | have "f \<midarrow>0\<rightarrow>0" if "fls_subdegree F > 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1821 | using fls_eq0_below_subdegree[OF that] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1822 | by (metis F \<open>0 \<le> fls_subdegree F\<close> has_laurent_expansion_imp_tendsto_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1823 | moreover have "fls_subdegree F > 0" if "f \<midarrow>0\<rightarrow>0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1824 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1825 | have False if "fls_subdegree F = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1826 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1827 | have "f \<midarrow>0\<rightarrow> fls_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1828 | using has_laurent_expansion_imp_tendsto_0 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1829 | [OF F \<open>fls_subdegree F \<ge>0\<close>] . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1830 | then have "fls_nth F 0 = 0" using \<open>f \<midarrow>0\<rightarrow>0\<close> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1831 | using LIM_unique by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1832 | then have "F = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1833 | using nth_fls_subdegree_zero_iff \<open>fls_subdegree F = 0\<close> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1834 | by metis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1835 | with \<open>F\<noteq>0\<close> show False by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1836 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1837 | with \<open>fls_subdegree F \<ge>0\<close> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1838 | show ?thesis by fastforce | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1839 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1840 | ultimately show ?thesis by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1841 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1842 | moreover have "is_pole f 0 \<or> (\<exists>x. f \<midarrow>0\<rightarrow>x)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1843 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1844 | have "not_essential f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1845 | using F has_laurent_expansion_not_essential_0 by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1846 | then show ?thesis unfolding not_essential_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1847 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1848 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1849 | ultimately show ?thesis by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1850 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1851 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1852 | lemma tendsto_0_subdegree_iff: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1853 | assumes F:"(\<lambda>w. f (z+w)) has_laurent_expansion F" and "F\<noteq>0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1854 | shows "(f \<midarrow>z\<rightarrow>0) \<longleftrightarrow> fls_subdegree F > 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1855 | apply (subst Lim_at_zero) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1856 | apply (rule tendsto_0_subdegree_iff_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1857 | using assms by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1858 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1859 | lemma is_pole_0_deriv_divide_iff: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1860 | assumes F:"f has_laurent_expansion F" and "F\<noteq>0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1861 | shows "is_pole (\<lambda>x. deriv f x / f x) 0 \<longleftrightarrow> is_pole f 0 \<or> (f \<midarrow>0\<rightarrow>0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1862 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1863 | have "(\<lambda>x. deriv f x / f x) has_laurent_expansion fls_deriv F / F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1864 | using F by (auto intro:laurent_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1865 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1866 | have "is_pole (\<lambda>x. deriv f x / f x) 0 \<longleftrightarrow> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1867 | fls_subdegree (fls_deriv F / F) < 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1868 | apply (rule is_pole_fls_subdegree_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1869 | using F by (auto intro:laurent_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1870 | also have "... \<longleftrightarrow> is_pole f 0 \<or> (f \<midarrow>0\<rightarrow>0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1871 | proof (cases "fls_subdegree F = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1872 | case True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1873 | then have "fls_subdegree (fls_deriv F / F) \<ge> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1874 | by (metis diff_zero div_0 \<open>F\<noteq>0\<close> fls_deriv_subdegree0 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1875 | fls_divide_subdegree) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1876 | moreover then have "\<not> is_pole f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1877 | by (metis F True is_pole_0_imp_neg_fls_subdegree less_le) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1878 | moreover have "\<not> (f \<midarrow>0\<rightarrow>0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1879 | using tendsto_0_subdegree_iff_0[OF F \<open>F\<noteq>0\<close>] True by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1880 | ultimately show ?thesis by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1881 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1882 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1883 | then have "fls_deriv F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1884 | by (metis fls_const_subdegree fls_deriv_eq_0_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1885 | then have "fls_subdegree (fls_deriv F / F) = | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1886 | fls_subdegree (fls_deriv F) - fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1887 | by (rule fls_divide_subdegree[OF _ \<open>F\<noteq>0\<close>]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1888 | moreover have "fls_subdegree (fls_deriv F) = fls_subdegree F - 1" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1889 | using fls_subdegree_deriv[OF False] . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1890 | ultimately have "fls_subdegree (fls_deriv F / F) < 0" by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1891 | moreover have "f \<midarrow>0\<rightarrow> 0 = (0 < fls_subdegree F)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1892 | using tendsto_0_subdegree_iff_0[OF F \<open>F \<noteq> 0\<close>] . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1893 | moreover have "is_pole f 0 = (fls_subdegree F < 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1894 | using is_pole_fls_subdegree_iff F by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1895 | ultimately show ?thesis using False by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1896 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1897 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1898 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1899 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1900 | lemma is_pole_deriv_divide_iff: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1901 | assumes F:"(\<lambda>w. f (z+w)) has_laurent_expansion F" and "F\<noteq>0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1902 | shows "is_pole (\<lambda>x. deriv f x / f x) z \<longleftrightarrow> is_pole f z \<or> (f \<midarrow>z\<rightarrow>0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1903 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1904 | define ff df where "ff=(\<lambda>w. f (z+w))" and "df=(\<lambda>w. deriv f (z + w))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1905 | have "is_pole (\<lambda>x. deriv f x / f x) z | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1906 | \<longleftrightarrow> is_pole (\<lambda>x. deriv ff x / ff x) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1907 | unfolding ff_def df_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1908 | by (simp add:deriv_shift_0' is_pole_shift_0' comp_def algebra_simps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1909 | moreover have "is_pole f z \<longleftrightarrow> is_pole ff 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1910 | unfolding ff_def by (auto simp:is_pole_shift_0') | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1911 | moreover have "(f \<midarrow>z\<rightarrow>0) \<longleftrightarrow> (ff \<midarrow>0\<rightarrow>0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1912 | unfolding ff_def by (simp add: LIM_offset_zero_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1913 | moreover have "is_pole (\<lambda>x. deriv ff x / ff x) 0 = (is_pole ff 0 \<or> ff \<midarrow>0\<rightarrow> 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1914 | apply (rule is_pole_0_deriv_divide_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1915 | using F ff_def \<open>F\<noteq>0\<close> by blast+ | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1916 | ultimately show ?thesis by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1917 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1918 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1919 | lemma subdegree_imp_eventually_deriv_nzero_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1920 | assumes F:"f has_laurent_expansion F" and "fls_subdegree F\<noteq>0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1921 | shows "eventually (\<lambda>z. deriv f z \<noteq> 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1922 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1923 | have "deriv f has_laurent_expansion fls_deriv F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1924 | using has_laurent_expansion_deriv[OF F] . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1925 | moreover have "fls_deriv F\<noteq>0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1926 | using \<open>fls_subdegree F\<noteq>0\<close> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1927 | by (metis fls_const_subdegree fls_deriv_eq_0_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1928 | ultimately show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1929 | using has_laurent_expansion_eventually_nonzero_iff' by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1930 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1931 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1932 | lemma subdegree_imp_eventually_deriv_nzero: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1933 | assumes F:"(\<lambda>w. f (z+w)) has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1934 | and "fls_subdegree F\<noteq>0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1935 | shows "eventually (\<lambda>w. deriv f w \<noteq> 0) (at z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1936 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1937 | have "\<forall>\<^sub>F x in at 0. deriv (\<lambda>w. f (z + w)) x \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1938 | using subdegree_imp_eventually_deriv_nzero_0 assms by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1939 | then show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1940 | apply (subst eventually_at_to_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1941 | by (simp add:deriv_shift_0' comp_def algebra_simps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1942 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1943 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1944 | lemma has_fps_expansion_imp_asymp_equiv_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1945 | fixes f :: "complex \<Rightarrow> complex" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1946 | assumes F: "f has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1947 | defines "n \<equiv> subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1948 | shows "f \<sim>[nhds 0] (\<lambda>z. fps_nth F n * z ^ n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1949 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1950 | have F': "f has_laurent_expansion fps_to_fls F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1951 | using F has_laurent_expansion_fps by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1952 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1953 | have "f \<sim>[at 0] (\<lambda>z. fps_nth F n * z ^ n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1954 | using has_laurent_expansion_imp_asymp_equiv_0[OF F'] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1955 | by (simp add: fls_subdegree_fls_to_fps n_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1956 | moreover have "f 0 = fps_nth F n * 0 ^ n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1957 | using F by (auto simp: n_def has_fps_expansion_to_laurent power_0_left) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1958 | ultimately show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1959 | by (auto simp: asymp_equiv_nhds_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1960 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1961 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1962 | lemma has_fps_expansion_imp_tendsto_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1963 | fixes f :: "complex \<Rightarrow> complex" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1964 | assumes "f has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1965 | shows "(f \<longlongrightarrow> fps_nth F 0) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1966 | proof (rule asymp_equiv_tendsto_transfer) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1967 | show "(\<lambda>z. fps_nth F (subdegree F) * z ^ subdegree F) \<sim>[nhds 0] f" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1968 | by (rule asymp_equiv_symI, rule has_fps_expansion_imp_asymp_equiv_0) fact | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1969 | have "((\<lambda>z. F $ subdegree F * z ^ subdegree F) \<longlongrightarrow> F $ 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1970 | by (rule tendsto_eq_intros refl | simp)+ (auto simp: power_0_left) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1971 | thus "((\<lambda>z. F $ subdegree F * z ^ subdegree F) \<longlongrightarrow> F $ 0) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1972 | by (auto simp: tendsto_nhds_iff power_0_left) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1973 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1974 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1975 | lemma has_fps_expansion_imp_0_eq_fps_nth_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1976 | assumes "f has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1977 | shows "f 0 = fps_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1978 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1979 | have "eventually (\<lambda>x. f x = eval_fps F x) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1980 | using assms by (auto simp: has_fps_expansion_def eq_commute) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1981 | then obtain A where "open A" "0 \<in> A" "\<forall>x\<in>A. f x = eval_fps F x" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1982 | unfolding eventually_nhds by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1983 | hence "f 0 = eval_fps F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1984 | by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1985 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1986 | by (simp add: eval_fps_at_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1987 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1988 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1989 | lemma fls_nth_compose_aux: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1990 | assumes "f has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1991 | assumes G: "g has_fps_expansion G" "fps_nth G 0 = 0" "fps_deriv G \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1992 | assumes "(f \<circ> g) has_laurent_expansion H" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1993 | shows "fls_nth H (int n) = fps_nth (fps_compose F G) n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1994 | using assms(1,5) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1995 | proof (induction n arbitrary: f F H rule: less_induct) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1996 | case (less n f F H) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1997 | have [simp]: "g 0 = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1998 | using has_fps_expansion_imp_0_eq_fps_nth_0[OF G(1)] G(2) by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 1999 |   have ana_f: "f analytic_on {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2000 | using less.prems by (meson has_fps_expansion_imp_analytic_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2001 |   have ana_g: "g analytic_on {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2002 | using G by (meson has_fps_expansion_imp_analytic_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2003 | have "(f \<circ> g) has_laurent_expansion fps_to_fls (fps_expansion (f \<circ> g) 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2004 | by (rule analytic_at_imp_has_fps_expansion_0 analytic_intros has_laurent_expansion_fps | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2005 | analytic_on_compose_gen ana_f ana_g)+ auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2006 | with less.prems have "H = fps_to_fls (fps_expansion (f \<circ> g) 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2007 | using has_laurent_expansion_unique by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2008 | also have "fls_subdegree \<dots> \<ge> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2009 | by (simp add: fls_subdegree_fls_to_fps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2010 | finally have subdeg: "fls_subdegree H \<ge> 0" . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2011 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2012 | show ?case | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2013 | proof (cases "n = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2014 | case [simp]: True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2015 | have lim_g: "g \<midarrow>0\<rightarrow> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2016 | using has_laurent_expansion_imp_tendsto_0[of g "fps_to_fls G"] G | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2017 | by (auto simp: fls_subdegree_fls_to_fps_gt0 has_fps_expansion_to_laurent) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2018 | have lim_f: "(f \<longlongrightarrow> fps_nth F 0) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2019 | by (intro has_fps_expansion_imp_tendsto_0 less.prems) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2020 | have "(\<lambda>x. f (g x)) \<midarrow>0\<rightarrow> fps_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2021 | by (rule filterlim_compose[OF lim_f lim_g]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2022 | moreover have "(f \<circ> g) \<midarrow>0\<rightarrow> fls_nth H 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2023 | by (intro has_laurent_expansion_imp_tendsto_0 less.prems subdeg) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2024 | ultimately have "fps_nth F 0 = fls_nth H 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2025 | using tendsto_unique by (force simp: o_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2026 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2027 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2028 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2029 | case n: False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2030 | define GH where "GH = (fls_deriv H / fls_deriv (fps_to_fls G))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2031 | define GH' where "GH' = fls_regpart GH" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2032 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2033 | have "(\<lambda>x. deriv (f \<circ> g) x / deriv g x) has_laurent_expansion | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2034 | fls_deriv H / fls_deriv (fps_to_fls G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2035 | by (intro laurent_expansion_intros less.prems has_laurent_expansion_fps[of _ G] G) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2036 | also have "?this \<longleftrightarrow> (deriv f \<circ> g) has_laurent_expansion fls_deriv H / fls_deriv (fps_to_fls G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2037 | proof (rule has_laurent_expansion_cong) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2038 | from ana_f obtain r1 where r1: "r1 > 0" "f holomorphic_on ball 0 r1" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2039 | unfolding analytic_on_def by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2040 | from ana_g obtain r2 where r2: "r2 > 0" "g holomorphic_on ball 0 r2" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2041 | unfolding analytic_on_def by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2042 | have lim_g: "g \<midarrow>0\<rightarrow> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2043 | using has_laurent_expansion_imp_tendsto_0[of g "fps_to_fls G"] G | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2044 | by (auto simp: fls_subdegree_fls_to_fps_gt0 has_fps_expansion_to_laurent) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2045 | moreover have "open (ball 0 r1)" "0 \<in> ball 0 r1" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2046 | using r1 by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2047 | ultimately have "eventually (\<lambda>x. g x \<in> ball 0 r1) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2048 | unfolding tendsto_def by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2049 | moreover have "eventually (\<lambda>x. deriv g x \<noteq> 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2050 | using G fps_to_fls_eq_0_iff has_fps_expansion_deriv has_fps_expansion_to_laurent | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2051 | has_laurent_expansion_nonzero_imp_eventually_nonzero by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2052 |       moreover have "eventually (\<lambda>x. x \<in> ball 0 (min r1 r2) - {0}) (at 0)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2053 | by (intro eventually_at_in_open) (use r1 r2 in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2054 | ultimately show "eventually (\<lambda>x. deriv (f \<circ> g) x / deriv g x = (deriv f \<circ> g) x) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2055 | proof eventually_elim | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2056 | case (elim x) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2057 | thus ?case using r1 r2 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2058 | by (subst deriv_chain) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2059 | (auto simp: field_simps holomorphic_on_def at_within_open[of _ "ball _ _"]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2060 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2061 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2062 | finally have GH: "(deriv f \<circ> g) has_laurent_expansion GH" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2063 | unfolding GH_def . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2064 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2065 | have "(deriv f \<circ> g) has_laurent_expansion fps_to_fls (fps_expansion (deriv f \<circ> g) 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2066 | by (rule analytic_at_imp_has_fps_expansion_0 analytic_intros has_laurent_expansion_fps | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2067 | analytic_on_compose_gen ana_f ana_g)+ auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2068 | with GH have "GH = fps_to_fls (fps_expansion (deriv f \<circ> g) 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2069 | using has_laurent_expansion_unique by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2070 | also have "fls_subdegree \<dots> \<ge> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2071 | by (simp add: fls_subdegree_fls_to_fps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2072 | finally have subdeg': "fls_subdegree GH \<ge> 0" . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2073 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2074 | have "deriv f has_fps_expansion fps_deriv F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2075 | by (intro fps_expansion_intros less.prems) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2076 | from this and GH have IH: "fls_nth GH (int k) = fps_nth (fps_compose (fps_deriv F) G) k" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2077 | if "k < n" for k | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2078 | by (intro less.IH that) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2079 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2080 | have "fps_nth (fps_compose (fps_deriv F) G) n = (\<Sum>i=0..n. of_nat (Suc i) * F $ Suc i * G ^ i $ n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2081 | by (simp add: fps_compose_nth) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2082 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2083 | have "fps_nth (fps_compose F G) n = | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2084 | fps_nth (fps_deriv (fps_compose F G)) (n - 1) / of_nat n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2085 | using n by (cases n) (auto simp del: of_nat_Suc) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2086 | also have "fps_deriv (fps_compose F G) = fps_compose (fps_deriv F) G * fps_deriv G " | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2087 | using G by (subst fps_compose_deriv) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2088 | also have "fps_nth \<dots> (n - 1) = (\<Sum>i=0..n-1. (fps_deriv F oo G) $ i * fps_deriv G $ (n - 1 - i))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2089 | unfolding fps_mult_nth .. | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2090 | also have "\<dots> = (\<Sum>i=0..n-1. fps_nth GH' i * of_nat (n - i) * G $ (n - i))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2091 | using n by (intro sum.cong) (auto simp: IH Suc_diff_Suc GH'_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2092 | also have "\<dots> = (\<Sum>i=0..n. fps_nth GH' i * of_nat (n - i) * G $ (n - i))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2093 | by (intro sum.mono_neutral_left) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2094 | also have "\<dots> = fps_nth (GH' * Abs_fps (\<lambda>i. of_nat i * fps_nth G i)) n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2095 | by (simp add: fps_mult_nth mult_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2096 | also have "Abs_fps (\<lambda>i. of_nat i * fps_nth G i) = fps_X * fps_deriv G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2097 | by (simp add: fps_mult_fps_X_deriv_shift) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2098 | also have "fps_nth (GH' * (fps_X * fps_deriv G)) n = | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2099 | fls_nth (fps_to_fls (GH' * (fps_X * fps_deriv G))) (int n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2100 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2101 | also have "fps_to_fls (GH' * (fps_X * fps_deriv G)) = | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2102 | GH * fps_to_fls (fps_deriv G) * fls_X" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2103 | using subdeg' by (simp add: mult_ac fls_times_fps_to_fls GH'_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2104 | also have "GH * fps_to_fls (fps_deriv G) = fls_deriv H" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2105 | unfolding GH_def using G by (simp add: fls_deriv_fps_to_fls) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2106 | also have "fls_deriv H * fls_X = fls_shift (-1) (fls_deriv H)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2107 | using fls_X_times_conv_shift(2) by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2108 | finally show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2109 | using n by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2110 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2111 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2112 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2113 | lemma has_fps_expansion_compose [fps_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2114 | fixes f g :: "complex \<Rightarrow> complex" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2115 | assumes F: "f has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2116 | assumes G: "g has_fps_expansion G" "fps_nth G 0 = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2117 | shows "(f \<circ> g) has_fps_expansion fps_compose F G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2118 | proof (cases "fps_deriv G = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2119 | case False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2120 | have [simp]: "g 0 = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2121 | using has_fps_expansion_imp_0_eq_fps_nth_0[OF G(1)] G(2) False by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2122 |   have ana_f: "f analytic_on {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2123 | using F by (meson has_fps_expansion_imp_analytic_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2124 |   have ana_g: "g analytic_on {0}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2125 | using G by (meson has_fps_expansion_imp_analytic_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2126 | have fg: "(f \<circ> g) has_fps_expansion fps_expansion (f \<circ> g) 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2127 | by (rule analytic_at_imp_has_fps_expansion_0 analytic_intros | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2128 | analytic_on_compose_gen ana_f ana_g)+ auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2129 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2130 | have "fls_nth (fps_to_fls (fps_expansion (f \<circ> g) 0)) (int n) = fps_nth (fps_compose F G) n" for n | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2131 | by (rule fls_nth_compose_aux has_laurent_expansion_fps F G False fg)+ | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2132 | hence "fps_expansion (f \<circ> g) 0 = fps_compose F G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2133 | by (simp add: fps_eq_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2134 | thus ?thesis using fg | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2135 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2136 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2137 | case True | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2138 | have [simp]: "f 0 = fps_nth F 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2139 | using F by (auto dest: has_fps_expansion_imp_0_eq_fps_nth_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2140 | from True have "fps_nth G n = 0" for n | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2141 | using G(2) by (cases n) (auto simp del: of_nat_Suc) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2142 | hence [simp]: "G = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2143 | by (auto simp: fps_eq_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2144 | have "(\<lambda>_. f 0) has_fps_expansion fps_const (f 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2145 | by (intro fps_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2146 | also have "eventually (\<lambda>x. g x = 0) (nhds 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2147 | using G by (auto simp: has_fps_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2148 | hence "(\<lambda>_. f 0) has_fps_expansion fps_const (f 0) \<longleftrightarrow> (f \<circ> g) has_fps_expansion fps_const (f 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2149 | by (intro has_fps_expansion_cong) (auto elim!: eventually_mono) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2150 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2151 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2152 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2153 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2154 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2155 | lemma has_fps_expansion_fps_to_fls: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2156 | assumes "f has_laurent_expansion fps_to_fls F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2157 | shows "(\<lambda>z. if z = 0 then fps_nth F 0 else f z) has_fps_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2158 | (is "?f' has_fps_expansion _") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2159 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2160 | have "f has_laurent_expansion fps_to_fls F \<longleftrightarrow> ?f' has_laurent_expansion fps_to_fls F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2161 | by (intro has_laurent_expansion_cong) (auto simp: eventually_at_filter) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2162 | with assms show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2163 | by (auto simp: has_fps_expansion_to_laurent) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2164 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2165 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2166 | lemma has_laurent_expansion_compose [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2167 | fixes f g :: "complex \<Rightarrow> complex" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2168 | assumes F: "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2169 | assumes G: "g has_laurent_expansion fps_to_fls G" "fps_nth G 0 = 0" "G \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2170 | shows "(f \<circ> g) has_laurent_expansion fls_compose_fps F G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2171 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2172 | from assms have lim_g: "g \<midarrow>0\<rightarrow> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2173 | by (subst tendsto_0_subdegree_iff_0[OF G(1)]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2174 | (auto simp: fls_subdegree_fls_to_fps subdegree_pos_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2175 | have ev1: "eventually (\<lambda>z. g z \<noteq> 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2176 | using \<open>G \<noteq> 0\<close> G(1) fps_to_fls_eq_0_iff has_laurent_expansion_fps | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2177 | has_laurent_expansion_nonzero_imp_eventually_nonzero by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2178 | moreover have "eventually (\<lambda>z. z \<noteq> 0) (at (0 :: complex))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2179 | by (auto simp: eventually_at_filter) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2180 | ultimately have ev: "eventually (\<lambda>z. z \<noteq> 0 \<and> g z \<noteq> 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2181 | by eventually_elim blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2182 | from ev1 and lim_g have lim_g': "filterlim g (at 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2183 | by (auto simp: filterlim_at) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2184 | define g' where "g' = (\<lambda>z. if z = 0 then fps_nth G 0 else g z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2185 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2186 | show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2187 | proof (cases "F = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2188 | assume [simp]: "F = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2189 | have "eventually (\<lambda>z. f z = 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2190 | using F by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2191 | hence "eventually (\<lambda>z. f (g z) = 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2192 | using lim_g' by (rule eventually_compose_filterlim) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2193 | thus ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2194 | by (auto simp: has_laurent_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2195 | next | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2196 | assume [simp]: "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2197 | define n where "n = fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2198 | define f' where | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2199 | "f' = (\<lambda>z. if z = 0 then fps_nth (fls_base_factor_to_fps F) 0 else f z * z powi -n)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2200 | have "((\<lambda>z. (f' \<circ> g') z * g z powi n)) has_laurent_expansion fls_compose_fps F G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2201 | unfolding f'_def n_def fls_compose_fps_def g'_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2202 | by (intro fps_expansion_intros laurent_expansion_intros has_fps_expansion_fps_to_fls | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2203 | has_fps_expansion_fls_base_factor_to_fps assms has_laurent_expansion_fps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2204 | also have "?this \<longleftrightarrow> ?thesis" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2205 | by (intro has_laurent_expansion_cong eventually_mono[OF ev]) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2206 | (auto simp: f'_def power_int_minus g'_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2207 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2208 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2209 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2210 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2211 | lemma has_laurent_expansion_fls_X_inv [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2212 | "inverse has_laurent_expansion fls_X_inv" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2213 | using has_laurent_expansion_inverse[OF has_laurent_expansion_fps_X] | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2214 | by (simp add: fls_inverse_X) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2215 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2216 | lemma zorder_times_analytic: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2217 |   assumes "f analytic_on {z}" "g analytic_on {z}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2218 | assumes "eventually (\<lambda>z. f z * g z \<noteq> 0) (at z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2219 | shows "zorder (\<lambda>z. f z * g z) z = zorder f z + zorder g z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2220 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2221 | have *: "(\<lambda>w. f (z + w)) has_fps_expansion fps_expansion f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2222 | "(\<lambda>w. g (z + w)) has_fps_expansion fps_expansion g z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2223 | "(\<lambda>w. f (z + w) * g (z + w)) has_fps_expansion fps_expansion f z * fps_expansion g z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2224 | by (intro fps_expansion_intros analytic_at_imp_has_fps_expansion assms)+ | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2225 | have [simp]: "fps_expansion f z \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2226 | proof | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2227 | assume "fps_expansion f z = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2228 | hence "eventually (\<lambda>z. f z * g z = 0) (at z)" using *(1) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2229 | by (auto simp: has_fps_expansion_0_iff nhds_to_0' eventually_filtermap eventually_at_filter | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2230 | elim: eventually_mono) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2231 | with assms(3) have "eventually (\<lambda>z. False) (at z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2232 | by eventually_elim auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2233 | thus False by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2234 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2235 | have [simp]: "fps_expansion g z \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2236 | proof | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2237 | assume "fps_expansion g z = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2238 | hence "eventually (\<lambda>z. f z * g z = 0) (at z)" using *(2) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2239 | by (auto simp: has_fps_expansion_0_iff nhds_to_0' eventually_filtermap eventually_at_filter | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2240 | elim: eventually_mono) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2241 | with assms(3) have "eventually (\<lambda>z. False) (at z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2242 | by eventually_elim auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2243 | thus False by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2244 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2245 | from *[THEN has_fps_expansion_zorder] show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2246 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2247 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2248 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2249 | lemma zorder_const [simp]: "c \<noteq> 0 \<Longrightarrow> zorder (\<lambda>_. c) z = 0" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 2250 | by (intro zorder_eqI[where S = UNIV]) auto | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2251 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2252 | lemma zorder_prod_analytic: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2253 |   assumes "\<And>x. x \<in> A \<Longrightarrow> f x analytic_on {z}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2254 | assumes "eventually (\<lambda>z. (\<Prod>x\<in>A. f x z) \<noteq> 0) (at z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2255 | shows "zorder (\<lambda>z. \<Prod>x\<in>A. f x z) z = (\<Sum>x\<in>A. zorder (f x) z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2256 | using assms | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2257 | proof (induction A rule: infinite_finite_induct) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2258 | case (insert x A) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2259 | have "zorder (\<lambda>z. f x z * (\<Prod>x\<in>A. f x z)) z = zorder (f x) z + zorder (\<lambda>z. \<Prod>x\<in>A. f x z) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2260 | using insert.prems insert.hyps by (intro zorder_times_analytic analytic_intros) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2261 | also have "zorder (\<lambda>z. \<Prod>x\<in>A. f x z) z = (\<Sum>x\<in>A. zorder (f x) z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2262 | using insert.prems insert.hyps by (intro insert.IH) (auto elim!: eventually_mono) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2263 | finally show ?case using insert | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2264 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2265 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2266 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2267 | lemma zorder_eq_0I: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2268 |   assumes "g analytic_on {z}" "g z \<noteq> 0"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2269 | shows "zorder g z = 0" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 2270 | using analytic_at assms zorder_eqI by fastforce | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2271 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2272 | lemma zorder_pos_iff: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2273 | assumes "f holomorphic_on A" "open A" "z \<in> A" "frequently (\<lambda>z. f z \<noteq> 0) (at z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2274 | shows "zorder f z > 0 \<longleftrightarrow> f z = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2275 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2276 |   have "f analytic_on {z}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2277 | using assms analytic_at by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2278 | hence *: "(\<lambda>w. f (z + w)) has_fps_expansion fps_expansion f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2279 | using analytic_at_imp_has_fps_expansion by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2280 | have nz: "fps_expansion f z \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2281 | proof | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2282 | assume "fps_expansion f z = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2283 | hence "eventually (\<lambda>z. f z = 0) (nhds z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2284 | using * by (auto simp: has_fps_expansion_def nhds_to_0' eventually_filtermap add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2285 | hence "eventually (\<lambda>z. f z = 0) (at z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2286 | by (auto simp: eventually_at_filter elim: eventually_mono) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2287 | with assms show False | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2288 | by (auto simp: frequently_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2289 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2290 | from has_fps_expansion_zorder[OF * this] have eq: "zorder f z = int (subdegree (fps_expansion f z))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2291 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2292 | moreover have "subdegree (fps_expansion f z) = 0 \<longleftrightarrow> fps_nth (fps_expansion f z) 0 \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2293 | using nz by (auto simp: subdegree_eq_0_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2294 | moreover have "fps_nth (fps_expansion f z) 0 = f z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2295 | by (auto simp: fps_expansion_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2296 | ultimately show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2297 | by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2298 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2299 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2300 | lemma zorder_pos_iff': | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2301 |   assumes "f analytic_on {z}" "frequently (\<lambda>z. f z \<noteq> 0) (at z)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2302 | shows "zorder f z > 0 \<longleftrightarrow> f z = 0" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 2303 | using analytic_at assms zorder_pos_iff by blast | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2304 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2305 | lemma zorder_ge_0: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2306 |   assumes "f analytic_on {z}" "frequently (\<lambda>z. f z \<noteq> 0) (at z)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2307 | shows "zorder f z \<ge> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2308 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2309 | have *: "(\<lambda>w. f (z + w)) has_laurent_expansion fps_to_fls (fps_expansion f z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2310 | using assms by (simp add: analytic_at_imp_has_fps_expansion has_laurent_expansion_fps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2311 | from * assms(2) have "fps_to_fls (fps_expansion f z) \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2312 | by (auto simp: has_laurent_expansion_def frequently_def at_to_0' eventually_filtermap add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2313 | with has_laurent_expansion_zorder[OF *] show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2314 | by (simp add: fls_subdegree_fls_to_fps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2315 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2316 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2317 | lemma zorder_eq_0_iff: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2318 |   assumes "f analytic_on {z}" "frequently (\<lambda>w. f w \<noteq> 0) (at z)"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2319 | shows "zorder f z = 0 \<longleftrightarrow> f z \<noteq> 0" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 2320 | using assms zorder_eq_0I zorder_pos_iff' by fastforce | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2321 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2322 | lemma dist_mult_left: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2323 | "dist (a * b) (a * c :: 'a :: real_normed_field) = norm a * dist b c" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2324 | unfolding dist_norm right_diff_distrib [symmetric] norm_mult by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2325 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2326 | lemma dist_mult_right: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2327 | "dist (b * a) (c * a :: 'a :: real_normed_field) = norm a * dist b c" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2328 | using dist_mult_left[of a b c] by (simp add: mult_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2329 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2330 | lemma zorder_scale: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2331 |   assumes "f analytic_on {a * z}" "eventually (\<lambda>w. f w \<noteq> 0) (at (a * z))" "a \<noteq> 0"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2332 | shows "zorder (\<lambda>w. f (a * w)) z = zorder f (a * z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2333 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2334 | from assms(1) obtain r where r: "r > 0" "f holomorphic_on ball (a * z) r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2335 | by (auto simp: analytic_on_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2336 | have *: "open (ball (a * z) r)" "connected (ball (a * z) r)" "a * z \<in> ball (a * z) r" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2337 | using r \<open>a \<noteq> 0\<close> by (auto simp: dist_norm) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2338 |   from assms(2) have "eventually (\<lambda>w. f w \<noteq> 0 \<and> w \<in> ball (a * z) r - {a * z}) (at (a * z))"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2339 | using \<open>r > 0\<close> by (intro eventually_conj eventually_at_in_open) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2340 |   then obtain z0 where "f z0 \<noteq> 0 \<and> z0 \<in> ball (a * z) r - {a * z}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2341 | using eventually_happens[of _ "at (a * z)"] by force | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2342 | hence **: "\<exists>w\<in>ball (a * z) r. f w \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2343 | by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2344 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2345 | define n where "n = nat (zorder f (a * z))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2346 | obtain r' where r': | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2347 | "(if f (a * z) = 0 then 0 < zorder f (a * z) else zorder f (a * z) = 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2348 | "r' > 0" "cball (a * z) r' \<subseteq> ball (a * z) r" "zor_poly f (a * z) holomorphic_on cball (a * z) r'" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2349 | "\<And>w. w \<in> cball (a * z) r' \<Longrightarrow> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2350 | f w = zor_poly f (a * z) w * (w - a * z) ^ n \<and> zor_poly f (a * z) w \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2351 | unfolding n_def using zorder_exist_zero[OF r(2) * **] by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2352 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2353 | show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2354 | proof (rule zorder_eqI) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2355 | show "open (ball z (r' / norm a))" "z \<in> ball z (r' / norm a)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2356 | using r \<open>r' > 0\<close> \<open>a \<noteq> 0\<close> by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2357 | have "(*) a ` ball z (r' / cmod a) \<subseteq> cball (a * z) r'" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2358 | proof safe | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2359 | fix w assume "w \<in> ball z (r' / cmod a)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2360 | thus "a * w \<in> cball (a * z) r'" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2361 | using dist_mult_left[of a z w] \<open>a \<noteq> 0\<close> by (auto simp: divide_simps mult_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2362 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2363 | thus "(\<lambda>w. a ^ n * (zor_poly f (a * z) \<circ> (\<lambda>w. a * w)) w) holomorphic_on ball z (r' / norm a)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2364 | using \<open>a \<noteq> 0\<close> by (intro holomorphic_on_compose_gen[OF _ r'(4)] holomorphic_intros) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2365 | show "a ^ n * (zor_poly f (a * z) \<circ> (\<lambda>w. a * w)) z \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2366 | using r' \<open>a \<noteq> 0\<close> by auto | 
| 77322 
9c295f84d55f
Replacing  z powr of_int i  by  z powi i   and adding new material from the AFP
 paulson <lp15@cam.ac.uk> parents: 
77277diff
changeset | 2367 | show "f (a * w) = a ^ n * (zor_poly f (a * z) \<circ> (*) a) w * (w - z) powi (zorder f (a * z))" | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2368 | if "w \<in> ball z (r' / norm a)" "w \<noteq> z" for w | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2369 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2370 | have "f (a * w) = zor_poly f (a * z) (a * w) * (a * (w - z)) ^ n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2371 | using that r'(5)[of "a * w"] dist_mult_left[of a z w] \<open>a \<noteq> 0\<close> unfolding ring_distribs | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2372 | by (auto simp: divide_simps mult_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2373 | also have "\<dots> = a ^ n * zor_poly f (a * z) (a * w) * (w - z) ^ n" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2374 | by (subst power_mult_distrib) (auto simp: mult_ac) | 
| 77322 
9c295f84d55f
Replacing  z powr of_int i  by  z powi i   and adding new material from the AFP
 paulson <lp15@cam.ac.uk> parents: 
77277diff
changeset | 2375 | also have "(w - z) ^ n = (w - z) powi of_nat n" | 
| 
9c295f84d55f
Replacing  z powr of_int i  by  z powi i   and adding new material from the AFP
 paulson <lp15@cam.ac.uk> parents: 
77277diff
changeset | 2376 | by simp | 
| 
9c295f84d55f
Replacing  z powr of_int i  by  z powi i   and adding new material from the AFP
 paulson <lp15@cam.ac.uk> parents: 
77277diff
changeset | 2377 | also have "of_nat n = zorder f (a * z)" | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2378 | using r'(1) by (auto simp: n_def split: if_splits) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2379 | finally show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2380 | unfolding o_def n_def . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2381 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2382 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2383 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2384 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2385 | lemma subdegree_fps_compose [simp]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2386 | fixes F G :: "'a :: idom fps" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2387 | assumes [simp]: "fps_nth G 0 = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2388 | shows "subdegree (fps_compose F G) = subdegree F * subdegree G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2389 | proof (cases "G = 0"; cases "F = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2390 | assume [simp]: "G \<noteq> 0" "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2391 | define m where "m = subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2392 | define F' where "F' = fps_shift m F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2393 | have F_eq: "F = F' * fps_X ^ m" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2394 | unfolding F'_def by (simp add: fps_shift_times_fps_X_power m_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2395 | have [simp]: "F' \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2396 | using \<open>F \<noteq> 0\<close> unfolding F_eq by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2397 | have "subdegree (fps_compose F G) = subdegree (fps_compose F' G) + m * subdegree G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2398 | by (simp add: F_eq fps_compose_mult_distrib fps_compose_eq_0_iff flip: fps_compose_power) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2399 | also have "subdegree (fps_compose F' G) = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2400 | by (intro subdegree_eq_0) (auto simp: F'_def m_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2401 | finally show ?thesis by (simp add: m_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2402 | qed auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2403 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2404 | lemma fls_subdegree_power_int [simp]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2405 | fixes F :: "'a :: field fls" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2406 | shows "fls_subdegree (F powi n) = n * fls_subdegree F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2407 | by (auto simp: power_int_def fls_subdegree_pow) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2408 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2409 | lemma subdegree_fls_compose_fps [simp]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2410 | fixes G :: "'a :: field fps" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2411 | assumes [simp]: "fps_nth G 0 = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2412 | shows "fls_subdegree (fls_compose_fps F G) = fls_subdegree F * subdegree G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2413 | proof (cases "F = 0"; cases "G = 0") | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2414 | assume [simp]: "G \<noteq> 0" "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2415 | have nz1: "fls_base_factor_to_fps F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2416 | using \<open>F \<noteq> 0\<close> fls_base_factor_to_fps_nonzero by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2417 | show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2418 | unfolding fls_compose_fps_def using nz1 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2419 | by (subst fls_subdegree_mult) (simp_all add: fps_compose_eq_0_iff fls_subdegree_fls_to_fps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2420 | qed (auto simp: fls_compose_fps_0_right) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2421 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2422 | lemma zorder_compose_aux: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2423 | assumes "isolated_singularity_at f 0" "not_essential f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2424 | assumes G: "g has_fps_expansion G" "G \<noteq> 0" "g 0 = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2425 | assumes "eventually (\<lambda>w. f w \<noteq> 0) (at 0)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2426 | shows "zorder (f \<circ> g) 0 = zorder f 0 * subdegree G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2427 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2428 | obtain F where F: "f has_laurent_expansion F" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2429 | using not_essential_has_laurent_expansion_0[OF assms(1,2)] by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2430 | have [simp]: "fps_nth G 0 = 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2431 | using G \<open>g 0 = 0\<close> by (simp add: has_fps_expansion_imp_0_eq_fps_nth_0) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2432 | note [simp] = \<open>G \<noteq> 0\<close> \<open>g 0 = 0\<close> | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2433 | have [simp]: "F \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2434 | using has_laurent_expansion_eventually_nonzero_iff[of f 0 F] F assms by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2435 | have FG: "(f \<circ> g) has_laurent_expansion fls_compose_fps F G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2436 | by (intro has_laurent_expansion_compose has_laurent_expansion_fps F G) auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2437 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2438 | have "zorder (f \<circ> g) 0 = fls_subdegree (fls_compose_fps F G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2439 | using has_laurent_expansion_zorder_0 [OF FG] by (auto simp: fls_compose_fps_eq_0_iff) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2440 | also have "\<dots> = fls_subdegree F * int (subdegree G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2441 | by simp | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2442 | also have "fls_subdegree F = zorder f 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2443 | using has_laurent_expansion_zorder_0 [OF F] by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2444 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2445 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2446 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2447 | lemma zorder_compose: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2448 | assumes "isolated_singularity_at f (g z)" "not_essential f (g z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2449 | assumes G: "(\<lambda>x. g (z + x) - g z) has_fps_expansion G" "G \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2450 | assumes "eventually (\<lambda>w. f w \<noteq> 0) (at (g z))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2451 | shows "zorder (f \<circ> g) z = zorder f (g z) * subdegree G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2452 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2453 | define f' where "f' = (\<lambda>w. f (g z + w))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2454 | define g' where "g' = (\<lambda>w. g (z + w) - g z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2455 | have "zorder f (g z) = zorder f' 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2456 | by (simp add: f'_def zorder_shift' add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2457 | have "zorder (\<lambda>x. g x - g z) z = zorder g' 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2458 | by (simp add: g'_def zorder_shift' add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2459 | have "zorder (f \<circ> g) z = zorder (f' \<circ> g') 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2460 | by (simp add: zorder_shift' f'_def g'_def add_ac o_def) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2461 | also have "\<dots> = zorder f' 0 * int (subdegree G)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2462 | proof (rule zorder_compose_aux) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2463 | show "isolated_singularity_at f' 0" unfolding f'_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2464 | using assms has_laurent_expansion_isolated_0 not_essential_has_laurent_expansion by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2465 | show "not_essential f' 0" unfolding f'_def | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2466 | using assms has_laurent_expansion_not_essential_0 not_essential_has_laurent_expansion by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2467 | qed (use assms in \<open>auto simp: f'_def g'_def at_to_0' eventually_filtermap add_ac\<close>) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2468 | also have "zorder f' 0 = zorder f (g z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2469 | by (simp add: f'_def zorder_shift' add_ac) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2470 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2471 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2472 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2473 | lemma fps_to_fls_eq_fls_const_iff [simp]: "fps_to_fls F = fls_const c \<longleftrightarrow> F = fps_const c" | 
| 78517 
28c1f4f5335f
Numerous minor tweaks and simplifications
 paulson <lp15@cam.ac.uk> parents: 
77322diff
changeset | 2474 | using fps_to_fls_eq_iff by fastforce | 
| 77277 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2475 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2476 | lemma zorder_compose': | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2477 | assumes "isolated_singularity_at f (g z)" "not_essential f (g z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2478 |   assumes "g analytic_on {z}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2479 | assumes "eventually (\<lambda>w. f w \<noteq> 0) (at (g z))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2480 | assumes "eventually (\<lambda>w. g w \<noteq> g z) (at z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2481 | shows "zorder (f \<circ> g) z = zorder f (g z) * zorder (\<lambda>x. g x - g z) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2482 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2483 | obtain G where G [fps_expansion_intros]: "(\<lambda>x. g (z + x)) has_fps_expansion G" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2484 | using assms analytic_at_imp_has_fps_expansion by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2485 | have G': "(\<lambda>x. g (z + x) - g z) has_fps_expansion G - fps_const (g z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2486 | by (intro fps_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2487 | hence G'': "(\<lambda>x. g (z + x) - g z) has_laurent_expansion fps_to_fls (G - fps_const (g z))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2488 | using has_laurent_expansion_fps by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2489 | have nz: "G - fps_const (g z) \<noteq> 0" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2490 | using has_laurent_expansion_eventually_nonzero_iff[OF G''] assms by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2491 | have "zorder (f \<circ> g) z = zorder f (g z) * subdegree (G - fps_const (g z))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2492 | proof (rule zorder_compose) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2493 | show "(\<lambda>x. g (z + x) - g z) has_fps_expansion G - fps_const (g z)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2494 | by (intro fps_expansion_intros) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2495 | qed (use assms nz in auto) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2496 | also have "int (subdegree (G - fps_const (g z))) = fls_subdegree (fps_to_fls G - fls_const (g z))" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2497 | by (simp flip: fls_subdegree_fls_to_fps) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2498 | also have "\<dots> = zorder (\<lambda>x. g x - g z) z" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2499 | using has_laurent_expansion_zorder [OF G''] nz by auto | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2500 | finally show ?thesis . | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2501 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2502 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2503 | lemma analytic_at_cong: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2504 | assumes "eventually (\<lambda>x. f x = g x) (nhds x)" "x = y" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2505 |   shows "f analytic_on {x} \<longleftrightarrow> g analytic_on {y}"
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2506 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2507 |   have "g analytic_on {x}" if "f analytic_on {x}" "eventually (\<lambda>x. f x = g x) (nhds x)" for f g
 | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2508 | proof - | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2509 | have "(\<lambda>y. f (x + y)) has_fps_expansion fps_expansion f x" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2510 | by (rule analytic_at_imp_has_fps_expansion) fact | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2511 | also have "?this \<longleftrightarrow> (\<lambda>y. g (x + y)) has_fps_expansion fps_expansion f x" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2512 | using that by (intro has_fps_expansion_cong refl) (auto simp: nhds_to_0' eventually_filtermap) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2513 | finally show ?thesis | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2514 | by (rule has_fps_expansion_imp_analytic) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2515 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2516 | from this[of f g] this[of g f] show ?thesis using assms | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2517 | by (auto simp: eq_commute) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2518 | qed | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2519 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2520 | lemma has_laurent_expansion_sin' [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2521 | "sin has_laurent_expansion fps_to_fls (fps_sin 1)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2522 | using has_fps_expansion_sin' has_fps_expansion_to_laurent by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2523 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2524 | lemma has_laurent_expansion_cos' [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2525 | "cos has_laurent_expansion fps_to_fls (fps_cos 1)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2526 | using has_fps_expansion_cos' has_fps_expansion_to_laurent by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2527 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2528 | lemma has_laurent_expansion_sin [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2529 | "(\<lambda>z. sin (c * z)) has_laurent_expansion fps_to_fls (fps_sin c)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2530 | by (intro has_laurent_expansion_fps has_fps_expansion_sin) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2531 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2532 | lemma has_laurent_expansion_cos [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2533 | "(\<lambda>z. cos (c * z)) has_laurent_expansion fps_to_fls (fps_cos c)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2534 | by (intro has_laurent_expansion_fps has_fps_expansion_cos) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2535 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2536 | lemma has_laurent_expansion_tan' [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2537 | "tan has_laurent_expansion fps_to_fls (fps_tan 1)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2538 | using has_fps_expansion_tan' has_fps_expansion_to_laurent by blast | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2539 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2540 | lemma has_laurent_expansion_tan [laurent_expansion_intros]: | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2541 | "(\<lambda>z. tan (c * z)) has_laurent_expansion fps_to_fls (fps_tan c)" | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2542 | by (intro has_laurent_expansion_fps has_fps_expansion_tan) | 
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2543 | |
| 
c6b50597abbc
More of Eberl's contributions: memomorphic functions
 paulson <lp15@cam.ac.uk> parents: diff
changeset | 2544 | end |