126 |
126 |
127 instance fps :: (semigroup_add) semigroup_add |
127 instance fps :: (semigroup_add) semigroup_add |
128 proof |
128 proof |
129 fix a b c :: "'a fps" |
129 fix a b c :: "'a fps" |
130 show "a + b + c = a + (b + c)" |
130 show "a + b + c = a + (b + c)" |
131 by (simp add: fps_ext add_assoc) |
131 by (simp add: fps_ext add.assoc) |
132 qed |
132 qed |
133 |
133 |
134 instance fps :: (ab_semigroup_add) ab_semigroup_add |
134 instance fps :: (ab_semigroup_add) ab_semigroup_add |
135 proof |
135 proof |
136 fix a b :: "'a fps" |
136 fix a b :: "'a fps" |
137 show "a + b = b + a" |
137 show "a + b = b + a" |
138 by (simp add: fps_ext add_commute) |
138 by (simp add: fps_ext add.commute) |
139 qed |
139 qed |
140 |
140 |
141 lemma fps_mult_assoc_lemma: |
141 lemma fps_mult_assoc_lemma: |
142 fixes k :: nat |
142 fixes k :: nat |
143 and f :: "nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> 'a::comm_monoid_add" |
143 and f :: "nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> 'a::comm_monoid_add" |
144 shows "(\<Sum>j=0..k. \<Sum>i=0..j. f i (j - i) (n - j)) = |
144 shows "(\<Sum>j=0..k. \<Sum>i=0..j. f i (j - i) (n - j)) = |
145 (\<Sum>j=0..k. \<Sum>i=0..k - j. f j i (n - j - i))" |
145 (\<Sum>j=0..k. \<Sum>i=0..k - j. f j i (n - j - i))" |
146 by (induct k) (simp_all add: Suc_diff_le setsum.distrib add_assoc) |
146 by (induct k) (simp_all add: Suc_diff_le setsum.distrib add.assoc) |
147 |
147 |
148 instance fps :: (semiring_0) semigroup_mult |
148 instance fps :: (semiring_0) semigroup_mult |
149 proof |
149 proof |
150 fix a b c :: "'a fps" |
150 fix a b c :: "'a fps" |
151 show "(a * b) * c = a * (b * c)" |
151 show "(a * b) * c = a * (b * c)" |
153 fix n :: nat |
153 fix n :: nat |
154 have "(\<Sum>j=0..n. \<Sum>i=0..j. a$i * b$(j - i) * c$(n - j)) = |
154 have "(\<Sum>j=0..n. \<Sum>i=0..j. a$i * b$(j - i) * c$(n - j)) = |
155 (\<Sum>j=0..n. \<Sum>i=0..n - j. a$j * b$i * c$(n - j - i))" |
155 (\<Sum>j=0..n. \<Sum>i=0..n - j. a$j * b$i * c$(n - j - i))" |
156 by (rule fps_mult_assoc_lemma) |
156 by (rule fps_mult_assoc_lemma) |
157 then show "((a * b) * c) $ n = (a * (b * c)) $ n" |
157 then show "((a * b) * c) $ n = (a * (b * c)) $ n" |
158 by (simp add: fps_mult_nth setsum_right_distrib setsum_left_distrib mult_assoc) |
158 by (simp add: fps_mult_nth setsum_right_distrib setsum_left_distrib mult.assoc) |
159 qed |
159 qed |
160 qed |
160 qed |
161 |
161 |
162 lemma fps_mult_commute_lemma: |
162 lemma fps_mult_commute_lemma: |
163 fixes n :: nat |
163 fixes n :: nat |
172 proof (rule fps_ext) |
172 proof (rule fps_ext) |
173 fix n :: nat |
173 fix n :: nat |
174 have "(\<Sum>i=0..n. a$i * b$(n - i)) = (\<Sum>i=0..n. a$(n - i) * b$i)" |
174 have "(\<Sum>i=0..n. a$i * b$(n - i)) = (\<Sum>i=0..n. a$(n - i) * b$i)" |
175 by (rule fps_mult_commute_lemma) |
175 by (rule fps_mult_commute_lemma) |
176 then show "(a * b) $ n = (b * a) $ n" |
176 then show "(a * b) $ n = (b * a) $ n" |
177 by (simp add: fps_mult_nth mult_commute) |
177 by (simp add: fps_mult_nth mult.commute) |
178 qed |
178 qed |
179 qed |
179 qed |
180 |
180 |
181 instance fps :: (monoid_add) monoid_add |
181 instance fps :: (monoid_add) monoid_add |
182 proof |
182 proof |
395 then show ?thesis by (simp add: fps_mult_nth X_def) |
395 then show ?thesis by (simp add: fps_mult_nth X_def) |
396 qed |
396 qed |
397 |
397 |
398 lemma X_mult_right_nth[simp]: |
398 lemma X_mult_right_nth[simp]: |
399 "((f :: 'a::comm_semiring_1 fps) * X) $n = (if n = 0 then 0 else f $ (n - 1))" |
399 "((f :: 'a::comm_semiring_1 fps) * X) $n = (if n = 0 then 0 else f $ (n - 1))" |
400 by (metis X_mult_nth mult_commute) |
400 by (metis X_mult_nth mult.commute) |
401 |
401 |
402 lemma X_power_iff: "X^k = Abs_fps (\<lambda>n. if n = k then 1::'a::comm_ring_1 else 0)" |
402 lemma X_power_iff: "X^k = Abs_fps (\<lambda>n. if n = k then 1::'a::comm_ring_1 else 0)" |
403 proof (induct k) |
403 proof (induct k) |
404 case 0 |
404 case 0 |
405 then show ?case by (simp add: X_def fps_eq_iff) |
405 then show ?case by (simp add: X_def fps_eq_iff) |
417 |
417 |
418 lemma X_power_mult_nth: |
418 lemma X_power_mult_nth: |
419 "(X^k * (f :: 'a::comm_ring_1 fps)) $n = (if n < k then 0 else f $ (n - k))" |
419 "(X^k * (f :: 'a::comm_ring_1 fps)) $n = (if n < k then 0 else f $ (n - k))" |
420 apply (induct k arbitrary: n) |
420 apply (induct k arbitrary: n) |
421 apply simp |
421 apply simp |
422 unfolding power_Suc mult_assoc |
422 unfolding power_Suc mult.assoc |
423 apply (case_tac n) |
423 apply (case_tac n) |
424 apply auto |
424 apply auto |
425 done |
425 done |
426 |
426 |
427 lemma X_power_mult_right_nth: |
427 lemma X_power_mult_right_nth: |
428 "((f :: 'a::comm_ring_1 fps) * X^k) $n = (if n < k then 0 else f $ (n - k))" |
428 "((f :: 'a::comm_ring_1 fps) * X^k) $n = (if n < k then 0 else f $ (n - k))" |
429 by (metis X_power_mult_nth mult_commute) |
429 by (metis X_power_mult_nth mult.commute) |
430 |
430 |
431 |
431 |
432 subsection{* Formal Power series form a metric space *} |
432 subsection{* Formal Power series form a metric space *} |
433 |
433 |
434 definition (in dist) "ball x r = {y. dist y x < r}" |
434 definition (in dist) "ball x r = {y. dist y x < r}" |
664 lemma inverse_mult_eq_1 [intro]: |
664 lemma inverse_mult_eq_1 [intro]: |
665 assumes f0: "f$0 \<noteq> (0::'a::field)" |
665 assumes f0: "f$0 \<noteq> (0::'a::field)" |
666 shows "inverse f * f = 1" |
666 shows "inverse f * f = 1" |
667 proof - |
667 proof - |
668 have c: "inverse f * f = f * inverse f" |
668 have c: "inverse f * f = f * inverse f" |
669 by (simp add: mult_commute) |
669 by (simp add: mult.commute) |
670 from f0 have ifn: "\<And>n. inverse f $ n = natfun_inverse f n" |
670 from f0 have ifn: "\<And>n. inverse f $ n = natfun_inverse f n" |
671 by (simp add: fps_inverse_def) |
671 by (simp add: fps_inverse_def) |
672 from f0 have th0: "(inverse f * f) $ 0 = 1" |
672 from f0 have th0: "(inverse f * f) $ 0 = 1" |
673 by (simp add: fps_mult_nth fps_inverse_def) |
673 by (simp add: fps_mult_nth fps_inverse_def) |
674 { |
674 { |
807 by (rule setsum.reindex_bij_witness[where i="op - (n + 1)" and j="op - (n + 1)"]) auto |
807 by (rule setsum.reindex_bij_witness[where i="op - (n + 1)" and j="op - (n + 1)"]) auto |
808 have s1: "setsum (\<lambda>i. f $ i * g $ (n + 1 - i)) ?Zn1 = |
808 have s1: "setsum (\<lambda>i. f $ i * g $ (n + 1 - i)) ?Zn1 = |
809 setsum (\<lambda>i. f $ (n + 1 - i) * g $ i) ?Zn1" |
809 setsum (\<lambda>i. f $ (n + 1 - i) * g $ i) ?Zn1" |
810 by (rule setsum.reindex_bij_witness[where i="op - (n + 1)" and j="op - (n + 1)"]) auto |
810 by (rule setsum.reindex_bij_witness[where i="op - (n + 1)" and j="op - (n + 1)"]) auto |
811 have "(f * ?D g + ?D f * g)$n = (?D g * f + ?D f * g)$n" |
811 have "(f * ?D g + ?D f * g)$n = (?D g * f + ?D f * g)$n" |
812 by (simp only: mult_commute) |
812 by (simp only: mult.commute) |
813 also have "\<dots> = (\<Sum>i = 0..n. ?g i)" |
813 also have "\<dots> = (\<Sum>i = 0..n. ?g i)" |
814 by (simp add: fps_mult_nth setsum.distrib[symmetric]) |
814 by (simp add: fps_mult_nth setsum.distrib[symmetric]) |
815 also have "\<dots> = setsum ?h {0..n+1}" |
815 also have "\<dots> = setsum ?h {0..n+1}" |
816 by (rule setsum.reindex_bij_witness_not_neutral |
816 by (rule setsum.reindex_bij_witness_not_neutral |
817 [where S'="{}" and T'="{0}" and j="Suc" and i="\<lambda>i. i - 1"]) auto |
817 [where S'="{}" and T'="{0}" and j="Suc" and i="\<lambda>i. i - 1"]) auto |
946 "fps_nth_deriv n (fps_const (c::'a::comm_ring_1) * f) = fps_const c * fps_nth_deriv n f" |
946 "fps_nth_deriv n (fps_const (c::'a::comm_ring_1) * f) = fps_const c * fps_nth_deriv n f" |
947 using fps_nth_deriv_linear[of n "c" f 0 0 ] by simp |
947 using fps_nth_deriv_linear[of n "c" f 0 0 ] by simp |
948 |
948 |
949 lemma fps_nth_deriv_mult_const_right[simp]: |
949 lemma fps_nth_deriv_mult_const_right[simp]: |
950 "fps_nth_deriv n (f * fps_const (c::'a::comm_ring_1)) = fps_nth_deriv n f * fps_const c" |
950 "fps_nth_deriv n (f * fps_const (c::'a::comm_ring_1)) = fps_nth_deriv n f * fps_const c" |
951 using fps_nth_deriv_linear[of n "c" f 0 0] by (simp add: mult_commute) |
951 using fps_nth_deriv_linear[of n "c" f 0 0] by (simp add: mult.commute) |
952 |
952 |
953 lemma fps_nth_deriv_setsum: |
953 lemma fps_nth_deriv_setsum: |
954 "fps_nth_deriv n (setsum f S) = setsum (\<lambda>i. fps_nth_deriv n (f i :: 'a::comm_ring_1 fps)) S" |
954 "fps_nth_deriv n (setsum f S) = setsum (\<lambda>i. fps_nth_deriv n (f i :: 'a::comm_ring_1 fps)) S" |
955 proof (cases "finite S") |
955 proof (cases "finite S") |
956 case True |
956 case True |
1024 } |
1024 } |
1025 moreover |
1025 moreover |
1026 { |
1026 { |
1027 assume m0: "m \<noteq> 0" |
1027 assume m0: "m \<noteq> 0" |
1028 have "a ^k $ m = (a^l * a) $m" |
1028 have "a ^k $ m = (a^l * a) $m" |
1029 by (simp add: k mult_commute) |
1029 by (simp add: k mult.commute) |
1030 also have "\<dots> = (\<Sum>i = 0..m. a ^ l $ i * a $ (m - i))" |
1030 also have "\<dots> = (\<Sum>i = 0..m. a ^ l $ i * a $ (m - i))" |
1031 by (simp add: fps_mult_nth) |
1031 by (simp add: fps_mult_nth) |
1032 also have "\<dots> = 0" |
1032 also have "\<dots> = 0" |
1033 apply (rule setsum.neutral) |
1033 apply (rule setsum.neutral) |
1034 apply auto |
1034 apply auto |
1112 apply (rule fps_inverse_unique) |
1112 apply (rule fps_inverse_unique) |
1113 apply (simp add: a0) |
1113 apply (simp add: a0) |
1114 unfolding power_mult_distrib[symmetric] |
1114 unfolding power_mult_distrib[symmetric] |
1115 apply (rule ssubst[where t = "a * inverse a" and s= 1]) |
1115 apply (rule ssubst[where t = "a * inverse a" and s= 1]) |
1116 apply simp_all |
1116 apply simp_all |
1117 apply (subst mult_commute) |
1117 apply (subst mult.commute) |
1118 apply (rule inverse_mult_eq_1[OF a0]) |
1118 apply (rule inverse_mult_eq_1[OF a0]) |
1119 done |
1119 done |
1120 } |
1120 } |
1121 ultimately show ?thesis by blast |
1121 ultimately show ?thesis by blast |
1122 qed |
1122 qed |
1142 by simp |
1142 by simp |
1143 with inverse_mult_eq_1[OF a0] |
1143 with inverse_mult_eq_1[OF a0] |
1144 have "(inverse a)\<^sup>2 * fps_deriv a + fps_deriv (inverse a) = 0" |
1144 have "(inverse a)\<^sup>2 * fps_deriv a + fps_deriv (inverse a) = 0" |
1145 unfolding power2_eq_square |
1145 unfolding power2_eq_square |
1146 apply (simp add: field_simps) |
1146 apply (simp add: field_simps) |
1147 apply (simp add: mult_assoc[symmetric]) |
1147 apply (simp add: mult.assoc[symmetric]) |
1148 done |
1148 done |
1149 then have "(inverse a)\<^sup>2 * fps_deriv a + fps_deriv (inverse a) - fps_deriv a * (inverse a)\<^sup>2 = |
1149 then have "(inverse a)\<^sup>2 * fps_deriv a + fps_deriv (inverse a) - fps_deriv a * (inverse a)\<^sup>2 = |
1150 0 - fps_deriv a * (inverse a)\<^sup>2" |
1150 0 - fps_deriv a * (inverse a)\<^sup>2" |
1151 by simp |
1151 by simp |
1152 then show "fps_deriv (inverse a) = - fps_deriv a * (inverse a)\<^sup>2" |
1152 then show "fps_deriv (inverse a) = - fps_deriv a * (inverse a)\<^sup>2" |
1192 by simp |
1192 by simp |
1193 |
1193 |
1194 lemma inverse_mult_eq_1': |
1194 lemma inverse_mult_eq_1': |
1195 assumes f0: "f$0 \<noteq> (0::'a::field)" |
1195 assumes f0: "f$0 \<noteq> (0::'a::field)" |
1196 shows "f * inverse f= 1" |
1196 shows "f * inverse f= 1" |
1197 by (metis mult_commute inverse_mult_eq_1 f0) |
1197 by (metis mult.commute inverse_mult_eq_1 f0) |
1198 |
1198 |
1199 lemma fps_divide_deriv: |
1199 lemma fps_divide_deriv: |
1200 fixes a :: "'a::field fps" |
1200 fixes a :: "'a::field fps" |
1201 assumes a0: "b$0 \<noteq> 0" |
1201 assumes a0: "b$0 \<noteq> 0" |
1202 shows "fps_deriv (a / b) = (fps_deriv a * b - a * fps_deriv b) / b\<^sup>2" |
1202 shows "fps_deriv (a / b) = (fps_deriv a * b - a * fps_deriv b) / b\<^sup>2" |
1396 let ?X = "1 - (X::'a fps)" |
1396 let ?X = "1 - (X::'a fps)" |
1397 have th0: "?X $ 0 \<noteq> 0" |
1397 have th0: "?X $ 0 \<noteq> 0" |
1398 by simp |
1398 by simp |
1399 have "a /?X = ?X * Abs_fps (\<lambda>n::nat. setsum (op $ a) {0..n}) * inverse ?X" |
1399 have "a /?X = ?X * Abs_fps (\<lambda>n::nat. setsum (op $ a) {0..n}) * inverse ?X" |
1400 using fps_divide_X_minus1_setsum_lemma[of a, symmetric] th0 |
1400 using fps_divide_X_minus1_setsum_lemma[of a, symmetric] th0 |
1401 by (simp add: fps_divide_def mult_assoc) |
1401 by (simp add: fps_divide_def mult.assoc) |
1402 also have "\<dots> = (inverse ?X * ?X) * Abs_fps (\<lambda>n::nat. setsum (op $ a) {0..n}) " |
1402 also have "\<dots> = (inverse ?X * ?X) * Abs_fps (\<lambda>n::nat. setsum (op $ a) {0..n}) " |
1403 by (simp add: mult_ac) |
1403 by (simp add: mult_ac) |
1404 finally show ?thesis |
1404 finally show ?thesis |
1405 by (simp add: inverse_mult_eq_1[OF th0]) |
1405 by (simp add: inverse_mult_eq_1[OF th0]) |
1406 qed |
1406 qed |
2287 apply (rule setsum.mono_neutral_right) |
2287 apply (rule setsum.mono_neutral_right) |
2288 apply (auto simp add: mult_delta_left setsum.delta not_le) |
2288 apply (auto simp add: mult_delta_left setsum.delta not_le) |
2289 done |
2289 done |
2290 also have "\<dots> = setsum (\<lambda>i. of_nat (i + 1) * a$(i+1) * (setsum (\<lambda>j. (b^ i)$j * of_nat (n - j + 1) * b$(n - j + 1)) {0..n})) {0.. n}" |
2290 also have "\<dots> = setsum (\<lambda>i. of_nat (i + 1) * a$(i+1) * (setsum (\<lambda>j. (b^ i)$j * of_nat (n - j + 1) * b$(n - j + 1)) {0..n})) {0.. n}" |
2291 unfolding fps_deriv_nth |
2291 unfolding fps_deriv_nth |
2292 by (rule setsum.reindex_cong [of Suc]) (auto simp add: mult_assoc) |
2292 by (rule setsum.reindex_cong [of Suc]) (auto simp add: mult.assoc) |
2293 finally have th0: "(fps_deriv (a oo b))$n = |
2293 finally have th0: "(fps_deriv (a oo b))$n = |
2294 setsum (\<lambda>i. of_nat (i + 1) * a$(i+1) * (setsum (\<lambda>j. (b^ i)$j * of_nat (n - j + 1) * b$(n - j + 1)) {0..n})) {0.. n}" . |
2294 setsum (\<lambda>i. of_nat (i + 1) * a$(i+1) * (setsum (\<lambda>j. (b^ i)$j * of_nat (n - j + 1) * b$(n - j + 1)) {0..n})) {0.. n}" . |
2295 |
2295 |
2296 have "(((fps_deriv a) oo b) * (fps_deriv b))$n = setsum (\<lambda>i. (fps_deriv b)$ (n - i) * ((fps_deriv a) oo b)$i) {0..n}" |
2296 have "(((fps_deriv a) oo b) * (fps_deriv b))$n = setsum (\<lambda>i. (fps_deriv b)$ (n - i) * ((fps_deriv a) oo b)$i) {0..n}" |
2297 unfolding fps_mult_nth by (simp add: mult_ac) |
2297 unfolding fps_mult_nth by (simp add: mult_ac) |
2298 also have "\<dots> = setsum (\<lambda>i. setsum (\<lambda>j. of_nat (n - i +1) * b$(n - i + 1) * of_nat (j + 1) * a$(j+1) * (b^j)$i) {0..n}) {0..n}" |
2298 also have "\<dots> = setsum (\<lambda>i. setsum (\<lambda>j. of_nat (n - i +1) * b$(n - i + 1) * of_nat (j + 1) * a$(j+1) * (b^j)$i) {0..n}) {0..n}" |
2299 unfolding fps_deriv_nth fps_compose_nth setsum_right_distrib mult_assoc |
2299 unfolding fps_deriv_nth fps_compose_nth setsum_right_distrib mult.assoc |
2300 apply (rule setsum.cong) |
2300 apply (rule setsum.cong) |
2301 apply (rule refl) |
2301 apply (rule refl) |
2302 apply (rule setsum.mono_neutral_left) |
2302 apply (rule setsum.mono_neutral_left) |
2303 apply (simp_all add: subset_eq) |
2303 apply (simp_all add: subset_eq) |
2304 apply clarify |
2304 apply clarify |
2501 done |
2501 done |
2502 also have "\<dots> = ?l" |
2502 also have "\<dots> = ?l" |
2503 apply (simp add: fps_mult_nth fps_compose_nth setsum_product) |
2503 apply (simp add: fps_mult_nth fps_compose_nth setsum_product) |
2504 apply (rule setsum.cong) |
2504 apply (rule setsum.cong) |
2505 apply (rule refl) |
2505 apply (rule refl) |
2506 apply (simp add: setsum.cartesian_product mult_assoc) |
2506 apply (simp add: setsum.cartesian_product mult.assoc) |
2507 apply (rule setsum.mono_neutral_right[OF f]) |
2507 apply (rule setsum.mono_neutral_right[OF f]) |
2508 apply (simp add: subset_eq) |
2508 apply (simp add: subset_eq) |
2509 apply presburger |
2509 apply presburger |
2510 apply clarsimp |
2510 apply clarsimp |
2511 apply (rule ccontr) |
2511 apply (rule ccontr) |
2687 from iffD1[OF radical_unique[where r=r and k=k and b= ?ab and a = "?r a oo b", OF rab0(2) th00 rab0(1)], OF th0] |
2687 from iffD1[OF radical_unique[where r=r and k=k and b= ?ab and a = "?r a oo b", OF rab0(2) th00 rab0(1)], OF th0] |
2688 show ?thesis . |
2688 show ?thesis . |
2689 qed |
2689 qed |
2690 |
2690 |
2691 lemma fps_const_mult_apply_left: "fps_const c * (a oo b) = (fps_const c * a) oo b" |
2691 lemma fps_const_mult_apply_left: "fps_const c * (a oo b) = (fps_const c * a) oo b" |
2692 by (simp add: fps_eq_iff fps_compose_nth setsum_right_distrib mult_assoc) |
2692 by (simp add: fps_eq_iff fps_compose_nth setsum_right_distrib mult.assoc) |
2693 |
2693 |
2694 lemma fps_const_mult_apply_right: |
2694 lemma fps_const_mult_apply_right: |
2695 "(a oo b) * fps_const (c::'a::comm_semiring_1) = (fps_const c * a) oo b" |
2695 "(a oo b) * fps_const (c::'a::comm_semiring_1) = (fps_const c * a) oo b" |
2696 by (auto simp add: fps_const_mult_apply_left mult_commute) |
2696 by (auto simp add: fps_const_mult_apply_left mult.commute) |
2697 |
2697 |
2698 lemma fps_compose_assoc: |
2698 lemma fps_compose_assoc: |
2699 assumes c0: "c$0 = (0::'a::idom)" |
2699 assumes c0: "c$0 = (0::'a::idom)" |
2700 and b0: "b$0 = 0" |
2700 and b0: "b$0 = 0" |
2701 shows "a oo (b oo c) = a oo b oo c" (is "?l = ?r") |
2701 shows "a oo (b oo c) = a oo b oo c" (is "?l = ?r") |
2702 proof - |
2702 proof - |
2703 { |
2703 { |
2704 fix n |
2704 fix n |
2705 have "?l$n = (setsum (\<lambda>i. (fps_const (a$i) * b^i) oo c) {0..n})$n" |
2705 have "?l$n = (setsum (\<lambda>i. (fps_const (a$i) * b^i) oo c) {0..n})$n" |
2706 by (simp add: fps_compose_nth fps_compose_power[OF c0] fps_const_mult_apply_left |
2706 by (simp add: fps_compose_nth fps_compose_power[OF c0] fps_const_mult_apply_left |
2707 setsum_right_distrib mult_assoc fps_setsum_nth) |
2707 setsum_right_distrib mult.assoc fps_setsum_nth) |
2708 also have "\<dots> = ((setsum (\<lambda>i. fps_const (a$i) * b^i) {0..n}) oo c)$n" |
2708 also have "\<dots> = ((setsum (\<lambda>i. fps_const (a$i) * b^i) {0..n}) oo c)$n" |
2709 by (simp add: fps_compose_setsum_distrib) |
2709 by (simp add: fps_compose_setsum_distrib) |
2710 also have "\<dots> = ?r$n" |
2710 also have "\<dots> = ?r$n" |
2711 apply (simp add: fps_compose_nth fps_setsum_nth setsum_left_distrib mult_assoc) |
2711 apply (simp add: fps_compose_nth fps_setsum_nth setsum_left_distrib mult.assoc) |
2712 apply (rule setsum.cong) |
2712 apply (rule setsum.cong) |
2713 apply (rule refl) |
2713 apply (rule refl) |
2714 apply (rule setsum.mono_neutral_right) |
2714 apply (rule setsum.mono_neutral_right) |
2715 apply (auto simp add: not_le) |
2715 apply (auto simp add: not_le) |
2716 apply (erule startsby_zero_power_prefix[OF b0, rule_format]) |
2716 apply (erule startsby_zero_power_prefix[OF b0, rule_format]) |
3050 from fps_inv_deriv[OF b0 b1, unfolded eq] |
3050 from fps_inv_deriv[OF b0 b1, unfolded eq] |
3051 have "fps_deriv (fps_inv ?b) = fps_const (inverse a) / (X + 1)" |
3051 have "fps_deriv (fps_inv ?b) = fps_const (inverse a) / (X + 1)" |
3052 using a |
3052 using a |
3053 by (simp add: fps_const_inverse eq fps_divide_def fps_inverse_mult) |
3053 by (simp add: fps_const_inverse eq fps_divide_def fps_inverse_mult) |
3054 then have "fps_deriv ?l = fps_deriv ?r" |
3054 then have "fps_deriv ?l = fps_deriv ?r" |
3055 by (simp add: fps_deriv_L add_commute fps_divide_def divide_inverse) |
3055 by (simp add: fps_deriv_L add.commute fps_divide_def divide_inverse) |
3056 then show ?thesis unfolding fps_deriv_eq_iff |
3056 then show ?thesis unfolding fps_deriv_eq_iff |
3057 by (simp add: L_nth fps_inv_def) |
3057 by (simp add: L_nth fps_inv_def) |
3058 qed |
3058 qed |
3059 |
3059 |
3060 lemma L_mult_add: |
3060 lemma L_mult_add: |
3092 let ?l = "?x1 * ?da" |
3092 let ?l = "?x1 * ?da" |
3093 let ?r = "fps_const c * a" |
3093 let ?r = "fps_const c * a" |
3094 have x10: "?x1 $ 0 \<noteq> 0" by simp |
3094 have x10: "?x1 $ 0 \<noteq> 0" by simp |
3095 have "?l = ?r \<longleftrightarrow> inverse ?x1 * ?l = inverse ?x1 * ?r" by simp |
3095 have "?l = ?r \<longleftrightarrow> inverse ?x1 * ?l = inverse ?x1 * ?r" by simp |
3096 also have "\<dots> \<longleftrightarrow> ?da = (fps_const c * a) / ?x1" |
3096 also have "\<dots> \<longleftrightarrow> ?da = (fps_const c * a) / ?x1" |
3097 apply (simp only: fps_divide_def mult_assoc[symmetric] inverse_mult_eq_1[OF x10]) |
3097 apply (simp only: fps_divide_def mult.assoc[symmetric] inverse_mult_eq_1[OF x10]) |
3098 apply (simp add: field_simps) |
3098 apply (simp add: field_simps) |
3099 done |
3099 done |
3100 finally have eq: "?l = ?r \<longleftrightarrow> ?lhs" by simp |
3100 finally have eq: "?l = ?r \<longleftrightarrow> ?lhs" by simp |
3101 moreover |
3101 moreover |
3102 {assume h: "?l = ?r" |
3102 {assume h: "?l = ?r" |
3117 then show ?case by simp |
3117 then show ?case by simp |
3118 next |
3118 next |
3119 case (Suc m) |
3119 case (Suc m) |
3120 then show ?case unfolding th0 |
3120 then show ?case unfolding th0 |
3121 apply (simp add: field_simps del: of_nat_Suc) |
3121 apply (simp add: field_simps del: of_nat_Suc) |
3122 unfolding mult_assoc[symmetric] gbinomial_mult_1 |
3122 unfolding mult.assoc[symmetric] gbinomial_mult_1 |
3123 apply (simp add: field_simps) |
3123 apply (simp add: field_simps) |
3124 done |
3124 done |
3125 qed |
3125 qed |
3126 } |
3126 } |
3127 note th1 = this |
3127 note th1 = this |
3133 } |
3133 } |
3134 moreover |
3134 moreover |
3135 { |
3135 { |
3136 assume h: ?rhs |
3136 assume h: ?rhs |
3137 have th00: "\<And>x y. x * (a$0 * y) = a$0 * (x*y)" |
3137 have th00: "\<And>x y. x * (a$0 * y) = a$0 * (x*y)" |
3138 by (simp add: mult_commute) |
3138 by (simp add: mult.commute) |
3139 have "?l = ?r" |
3139 have "?l = ?r" |
3140 apply (subst h) |
3140 apply (subst h) |
3141 apply (subst (2) h) |
3141 apply (subst (2) h) |
3142 apply (clarsimp simp add: fps_eq_iff field_simps) |
3142 apply (clarsimp simp add: fps_eq_iff field_simps) |
3143 unfolding mult_assoc[symmetric] th00 gbinomial_mult_1 |
3143 unfolding mult.assoc[symmetric] th00 gbinomial_mult_1 |
3144 apply (simp add: field_simps gbinomial_mult_1) |
3144 apply (simp add: field_simps gbinomial_mult_1) |
3145 done |
3145 done |
3146 } |
3146 } |
3147 ultimately show ?thesis by blast |
3147 ultimately show ?thesis by blast |
3148 qed |
3148 qed |
3179 (is "?l = inverse ?r") |
3179 (is "?l = inverse ?r") |
3180 proof- |
3180 proof- |
3181 have th: "?r$0 \<noteq> 0" by simp |
3181 have th: "?r$0 \<noteq> 0" by simp |
3182 have th': "fps_deriv (inverse ?r) = fps_const (- 1) * inverse ?r / (1 + X)" |
3182 have th': "fps_deriv (inverse ?r) = fps_const (- 1) * inverse ?r / (1 + X)" |
3183 by (simp add: fps_inverse_deriv[OF th] fps_divide_def |
3183 by (simp add: fps_inverse_deriv[OF th] fps_divide_def |
3184 power2_eq_square mult_commute fps_const_neg[symmetric] del: fps_const_neg) |
3184 power2_eq_square mult.commute fps_const_neg[symmetric] del: fps_const_neg) |
3185 have eq: "inverse ?r $ 0 = 1" |
3185 have eq: "inverse ?r $ 0 = 1" |
3186 by (simp add: fps_inverse_def) |
3186 by (simp add: fps_inverse_def) |
3187 from iffD1[OF fps_binomial_ODE_unique[of "inverse (1 + X)" "- 1"] th'] eq |
3187 from iffD1[OF fps_binomial_ODE_unique[of "inverse (1 + X)" "- 1"] th'] eq |
3188 show ?thesis by (simp add: fps_inverse_def) |
3188 show ?thesis by (simp add: fps_inverse_def) |
3189 qed |
3189 qed |