139 fix n :: nat |
139 fix n :: nat |
140 have "(\<Sum>j=0..n. \<Sum>i=0..j. a$i * b$(j - i) * c$(n - j)) = |
140 have "(\<Sum>j=0..n. \<Sum>i=0..j. a$i * b$(j - i) * c$(n - j)) = |
141 (\<Sum>j=0..n. \<Sum>i=0..n - j. a$j * b$i * c$(n - j - i))" |
141 (\<Sum>j=0..n. \<Sum>i=0..n - j. a$j * b$i * c$(n - j - i))" |
142 by (rule fps_mult_assoc_lemma) |
142 by (rule fps_mult_assoc_lemma) |
143 then show "((a * b) * c) $ n = (a * (b * c)) $ n" |
143 then show "((a * b) * c) $ n = (a * (b * c)) $ n" |
144 by (simp add: fps_mult_nth setsum_distrib_left setsum_distrib_right mult.assoc) |
144 by (simp add: fps_mult_nth sum_distrib_left sum_distrib_right mult.assoc) |
145 qed |
145 qed |
146 qed |
146 qed |
147 |
147 |
148 lemma fps_mult_commute_lemma: |
148 lemma fps_mult_commute_lemma: |
149 fixes n :: nat |
149 fixes n :: nat |
150 and f :: "nat \<Rightarrow> nat \<Rightarrow> 'a::comm_monoid_add" |
150 and f :: "nat \<Rightarrow> nat \<Rightarrow> 'a::comm_monoid_add" |
151 shows "(\<Sum>i=0..n. f i (n - i)) = (\<Sum>i=0..n. f (n - i) i)" |
151 shows "(\<Sum>i=0..n. f i (n - i)) = (\<Sum>i=0..n. f (n - i) i)" |
152 by (rule setsum.reindex_bij_witness[where i="op - n" and j="op - n"]) auto |
152 by (rule sum.reindex_bij_witness[where i="op - n" and j="op - n"]) auto |
153 |
153 |
154 instance fps :: (comm_semiring_0) ab_semigroup_mult |
154 instance fps :: (comm_semiring_0) ab_semigroup_mult |
155 proof |
155 proof |
156 fix a b :: "'a fps" |
156 fix a b :: "'a fps" |
157 show "a * b = b * a" |
157 show "a * b = b * a" |
319 Abs_fps (\<lambda>n. if n = 0 then f$0 + c else f$n)" |
319 Abs_fps (\<lambda>n. if n = 0 then f$0 + c else f$n)" |
320 by (simp add: fps_ext) |
320 by (simp add: fps_ext) |
321 |
321 |
322 lemma fps_const_mult_left: "fps_const (c::'a::semiring_0) * f = Abs_fps (\<lambda>n. c * f$n)" |
322 lemma fps_const_mult_left: "fps_const (c::'a::semiring_0) * f = Abs_fps (\<lambda>n. c * f$n)" |
323 unfolding fps_eq_iff fps_mult_nth |
323 unfolding fps_eq_iff fps_mult_nth |
324 by (simp add: fps_const_def mult_delta_left setsum.delta) |
324 by (simp add: fps_const_def mult_delta_left sum.delta) |
325 |
325 |
326 lemma fps_const_mult_right: "f * fps_const (c::'a::semiring_0) = Abs_fps (\<lambda>n. f$n * c)" |
326 lemma fps_const_mult_right: "f * fps_const (c::'a::semiring_0) = Abs_fps (\<lambda>n. f$n * c)" |
327 unfolding fps_eq_iff fps_mult_nth |
327 unfolding fps_eq_iff fps_mult_nth |
328 by (simp add: fps_const_def mult_delta_right setsum.delta') |
328 by (simp add: fps_const_def mult_delta_right sum.delta') |
329 |
329 |
330 lemma fps_mult_left_const_nth [simp]: "(fps_const (c::'a::semiring_1) * f)$n = c* f$n" |
330 lemma fps_mult_left_const_nth [simp]: "(fps_const (c::'a::semiring_1) * f)$n = c* f$n" |
331 by (simp add: fps_mult_nth mult_delta_left setsum.delta) |
331 by (simp add: fps_mult_nth mult_delta_left sum.delta) |
332 |
332 |
333 lemma fps_mult_right_const_nth [simp]: "(f * fps_const (c::'a::semiring_1))$n = f$n * c" |
333 lemma fps_mult_right_const_nth [simp]: "(f * fps_const (c::'a::semiring_1))$n = f$n * c" |
334 by (simp add: fps_mult_nth mult_delta_right setsum.delta') |
334 by (simp add: fps_mult_nth mult_delta_right sum.delta') |
335 |
335 |
336 |
336 |
337 subsection \<open>Formal power series form an integral domain\<close> |
337 subsection \<open>Formal power series form an integral domain\<close> |
338 |
338 |
339 instance fps :: (ring) ring .. |
339 instance fps :: (ring) ring .. |
352 unfolding fps_nonzero_nth_minimal |
352 unfolding fps_nonzero_nth_minimal |
353 by blast+ |
353 by blast+ |
354 have "(a * b) $ (i + j) = (\<Sum>k=0..i+j. a $ k * b $ (i + j - k))" |
354 have "(a * b) $ (i + j) = (\<Sum>k=0..i+j. a $ k * b $ (i + j - k))" |
355 by (rule fps_mult_nth) |
355 by (rule fps_mult_nth) |
356 also have "\<dots> = (a $ i * b $ (i + j - i)) + (\<Sum>k\<in>{0..i+j} - {i}. a $ k * b $ (i + j - k))" |
356 also have "\<dots> = (a $ i * b $ (i + j - i)) + (\<Sum>k\<in>{0..i+j} - {i}. a $ k * b $ (i + j - k))" |
357 by (rule setsum.remove) simp_all |
357 by (rule sum.remove) simp_all |
358 also have "(\<Sum>k\<in>{0..i+j}-{i}. a $ k * b $ (i + j - k)) = 0" |
358 also have "(\<Sum>k\<in>{0..i+j}-{i}. a $ k * b $ (i + j - k)) = 0" |
359 proof (rule setsum.neutral [rule_format]) |
359 proof (rule sum.neutral [rule_format]) |
360 fix k assume "k \<in> {0..i+j} - {i}" |
360 fix k assume "k \<in> {0..i+j} - {i}" |
361 then have "k < i \<or> i+j-k < j" |
361 then have "k < i \<or> i+j-k < j" |
362 by auto |
362 by auto |
363 then show "a $ k * b $ (i + j - k) = 0" |
363 then show "a $ k * b $ (i + j - k) = 0" |
364 using i j by auto |
364 using i j by auto |
422 "((a::'a::semiring_1 fps) * X) $ n = (if n = 0 then 0 else a $ (n - 1))" |
422 "((a::'a::semiring_1 fps) * X) $ n = (if n = 0 then 0 else a $ (n - 1))" |
423 proof - |
423 proof - |
424 have "(a * X) $ n = (\<Sum>i = 0..n. a $ i * (if n - i = Suc 0 then 1 else 0))" |
424 have "(a * X) $ n = (\<Sum>i = 0..n. a $ i * (if n - i = Suc 0 then 1 else 0))" |
425 by (simp add: fps_times_def X_def) |
425 by (simp add: fps_times_def X_def) |
426 also have "\<dots> = (\<Sum>i = 0..n. if i = n - 1 then if n = 0 then 0 else a $ i else 0)" |
426 also have "\<dots> = (\<Sum>i = 0..n. if i = n - 1 then if n = 0 then 0 else a $ i else 0)" |
427 by (intro setsum.cong) auto |
427 by (intro sum.cong) auto |
428 also have "\<dots> = (if n = 0 then 0 else a $ (n - 1))" by (simp add: setsum.delta) |
428 also have "\<dots> = (if n = 0 then 0 else a $ (n - 1))" by (simp add: sum.delta) |
429 finally show ?thesis . |
429 finally show ?thesis . |
430 qed |
430 qed |
431 |
431 |
432 lemma fps_mult_X_commute: "X * (a :: 'a :: semiring_1 fps) = a * X" |
432 lemma fps_mult_X_commute: "X * (a :: 'a :: semiring_1 fps) = a * X" |
433 by (simp add: fps_eq_iff) |
433 by (simp add: fps_eq_iff) |
585 proof- |
585 proof- |
586 let ?n = "subdegree f + subdegree g" |
586 let ?n = "subdegree f + subdegree g" |
587 have "(f * g) $ ?n = (\<Sum>i=0..?n. f$i * g$(?n-i))" |
587 have "(f * g) $ ?n = (\<Sum>i=0..?n. f$i * g$(?n-i))" |
588 by (simp add: fps_mult_nth) |
588 by (simp add: fps_mult_nth) |
589 also have "... = (\<Sum>i=0..?n. if i = subdegree f then f$i * g$(?n-i) else 0)" |
589 also have "... = (\<Sum>i=0..?n. if i = subdegree f then f$i * g$(?n-i) else 0)" |
590 proof (intro setsum.cong) |
590 proof (intro sum.cong) |
591 fix x assume x: "x \<in> {0..?n}" |
591 fix x assume x: "x \<in> {0..?n}" |
592 hence "x = subdegree f \<or> x < subdegree f \<or> ?n - x < subdegree g" by auto |
592 hence "x = subdegree f \<or> x < subdegree f \<or> ?n - x < subdegree g" by auto |
593 thus "f $ x * g $ (?n - x) = (if x = subdegree f then f $ x * g $ (?n - x) else 0)" |
593 thus "f $ x * g $ (?n - x) = (if x = subdegree f then f $ x * g $ (?n - x) else 0)" |
594 by (elim disjE conjE) auto |
594 by (elim disjE conjE) auto |
595 qed auto |
595 qed auto |
596 also have "... = f $ subdegree f * g $ subdegree g" by (simp add: setsum.delta) |
596 also have "... = f $ subdegree f * g $ subdegree g" by (simp add: sum.delta) |
597 finally show ?thesis . |
597 finally show ?thesis . |
598 qed |
598 qed |
599 |
599 |
600 lemma subdegree_mult [simp]: |
600 lemma subdegree_mult [simp]: |
601 assumes "f \<noteq> 0" "g \<noteq> 0" |
601 assumes "f \<noteq> 0" "g \<noteq> 0" |
602 shows "subdegree ((f :: ('a :: {ring_no_zero_divisors}) fps) * g) = subdegree f + subdegree g" |
602 shows "subdegree ((f :: ('a :: {ring_no_zero_divisors}) fps) * g) = subdegree f + subdegree g" |
603 proof (rule subdegreeI) |
603 proof (rule subdegreeI) |
604 let ?n = "subdegree f + subdegree g" |
604 let ?n = "subdegree f + subdegree g" |
605 have "(f * g) $ ?n = (\<Sum>i=0..?n. f$i * g$(?n-i))" by (simp add: fps_mult_nth) |
605 have "(f * g) $ ?n = (\<Sum>i=0..?n. f$i * g$(?n-i))" by (simp add: fps_mult_nth) |
606 also have "... = (\<Sum>i=0..?n. if i = subdegree f then f$i * g$(?n-i) else 0)" |
606 also have "... = (\<Sum>i=0..?n. if i = subdegree f then f$i * g$(?n-i) else 0)" |
607 proof (intro setsum.cong) |
607 proof (intro sum.cong) |
608 fix x assume x: "x \<in> {0..?n}" |
608 fix x assume x: "x \<in> {0..?n}" |
609 hence "x = subdegree f \<or> x < subdegree f \<or> ?n - x < subdegree g" by auto |
609 hence "x = subdegree f \<or> x < subdegree f \<or> ?n - x < subdegree g" by auto |
610 thus "f $ x * g $ (?n - x) = (if x = subdegree f then f $ x * g $ (?n - x) else 0)" |
610 thus "f $ x * g $ (?n - x) = (if x = subdegree f then f $ x * g $ (?n - x) else 0)" |
611 by (elim disjE conjE) auto |
611 by (elim disjE conjE) auto |
612 qed auto |
612 qed auto |
613 also have "... = f $ subdegree f * g $ subdegree g" by (simp add: setsum.delta) |
613 also have "... = f $ subdegree f * g $ subdegree g" by (simp add: sum.delta) |
614 also from assms have "... \<noteq> 0" by auto |
614 also from assms have "... \<noteq> 0" by auto |
615 finally show "(f * g) $ (subdegree f + subdegree g) \<noteq> 0" . |
615 finally show "(f * g) $ (subdegree f + subdegree g) \<noteq> 0" . |
616 next |
616 next |
617 fix m assume m: "m < subdegree f + subdegree g" |
617 fix m assume m: "m < subdegree f + subdegree g" |
618 have "(f * g) $ m = (\<Sum>i=0..m. f$i * g$(m-i))" by (simp add: fps_mult_nth) |
618 have "(f * g) $ m = (\<Sum>i=0..m. f$i * g$(m-i))" by (simp add: fps_mult_nth) |
619 also have "... = (\<Sum>i=0..m. 0)" |
619 also have "... = (\<Sum>i=0..m. 0)" |
620 proof (rule setsum.cong) |
620 proof (rule sum.cong) |
621 fix i assume "i \<in> {0..m}" |
621 fix i assume "i \<in> {0..m}" |
622 with m have "i < subdegree f \<or> m - i < subdegree g" by auto |
622 with m have "i < subdegree f \<or> m - i < subdegree g" by auto |
623 thus "f$i * g$(m-i) = 0" by (elim disjE) auto |
623 thus "f$i * g$(m-i) = 0" by (elim disjE) auto |
624 qed auto |
624 qed auto |
625 finally show "(f * g) $ m = 0" by simp |
625 finally show "(f * g) $ m = 0" by simp |
912 by (simp add: field_simps) |
912 by (simp add: field_simps) |
913 then show ?thesis |
913 then show ?thesis |
914 using kp by blast |
914 using kp by blast |
915 qed |
915 qed |
916 |
916 |
917 lemma fps_sum_rep_nth: "(setsum (\<lambda>i. fps_const(a$i)*X^i) {0..m})$n = |
917 lemma fps_sum_rep_nth: "(sum (\<lambda>i. fps_const(a$i)*X^i) {0..m})$n = |
918 (if n \<le> m then a$n else 0::'a::comm_ring_1)" |
918 (if n \<le> m then a$n else 0::'a::comm_ring_1)" |
919 apply (auto simp add: fps_setsum_nth cond_value_iff cong del: if_weak_cong) |
919 apply (auto simp add: fps_sum_nth cond_value_iff cong del: if_weak_cong) |
920 apply (simp add: setsum.delta') |
920 apply (simp add: sum.delta') |
921 done |
921 done |
922 |
922 |
923 lemma fps_notation: "(\<lambda>n. setsum (\<lambda>i. fps_const(a$i) * X^i) {0..n}) \<longlonglongrightarrow> a" |
923 lemma fps_notation: "(\<lambda>n. sum (\<lambda>i. fps_const(a$i) * X^i) {0..n}) \<longlonglongrightarrow> a" |
924 (is "?s \<longlonglongrightarrow> a") |
924 (is "?s \<longlonglongrightarrow> a") |
925 proof - |
925 proof - |
926 have "\<exists>n0. \<forall>n \<ge> n0. dist (?s n) a < r" if "r > 0" for r |
926 have "\<exists>n0. \<forall>n \<ge> n0. dist (?s n) a < r" if "r > 0" for r |
927 proof - |
927 proof - |
928 obtain n0 where n0: "(1/2)^n0 < r" "n0 > 0" |
928 obtain n0 where n0: "(1/2)^n0 < r" "n0 > 0" |
962 qed |
962 qed |
963 |
963 |
964 |
964 |
965 subsection \<open>Inverses of formal power series\<close> |
965 subsection \<open>Inverses of formal power series\<close> |
966 |
966 |
967 declare setsum.cong[fundef_cong] |
967 declare sum.cong[fundef_cong] |
968 |
968 |
969 instantiation fps :: ("{comm_monoid_add,inverse,times,uminus}") inverse |
969 instantiation fps :: ("{comm_monoid_add,inverse,times,uminus}") inverse |
970 begin |
970 begin |
971 |
971 |
972 fun natfun_inverse:: "'a fps \<Rightarrow> nat \<Rightarrow> 'a" |
972 fun natfun_inverse:: "'a fps \<Rightarrow> nat \<Rightarrow> 'a" |
973 where |
973 where |
974 "natfun_inverse f 0 = inverse (f$0)" |
974 "natfun_inverse f 0 = inverse (f$0)" |
975 | "natfun_inverse f n = - inverse (f$0) * setsum (\<lambda>i. f$i * natfun_inverse f (n - i)) {1..n}" |
975 | "natfun_inverse f n = - inverse (f$0) * sum (\<lambda>i. f$i * natfun_inverse f (n - i)) {1..n}" |
976 |
976 |
977 definition fps_inverse_def: "inverse f = (if f $ 0 = 0 then 0 else Abs_fps (natfun_inverse f))" |
977 definition fps_inverse_def: "inverse f = (if f $ 0 = 0 then 0 else Abs_fps (natfun_inverse f))" |
978 |
978 |
979 definition fps_divide_def: |
979 definition fps_divide_def: |
980 "f div g = (if g = 0 then 0 else |
980 "f div g = (if g = 0 then 0 else |
1010 from np have eq: "{0..n} = {0} \<union> {1 .. n}" |
1010 from np have eq: "{0..n} = {0} \<union> {1 .. n}" |
1011 by auto |
1011 by auto |
1012 have d: "{0} \<inter> {1 .. n} = {}" |
1012 have d: "{0} \<inter> {1 .. n} = {}" |
1013 by auto |
1013 by auto |
1014 from f0 np have th0: "- (inverse f $ n) = |
1014 from f0 np have th0: "- (inverse f $ n) = |
1015 (setsum (\<lambda>i. f$i * natfun_inverse f (n - i)) {1..n}) / (f$0)" |
1015 (sum (\<lambda>i. f$i * natfun_inverse f (n - i)) {1..n}) / (f$0)" |
1016 by (cases n) (simp_all add: divide_inverse fps_inverse_def) |
1016 by (cases n) (simp_all add: divide_inverse fps_inverse_def) |
1017 from th0[symmetric, unfolded nonzero_divide_eq_eq[OF f0]] |
1017 from th0[symmetric, unfolded nonzero_divide_eq_eq[OF f0]] |
1018 have th1: "setsum (\<lambda>i. f$i * natfun_inverse f (n - i)) {1..n} = - (f$0) * (inverse f)$n" |
1018 have th1: "sum (\<lambda>i. f$i * natfun_inverse f (n - i)) {1..n} = - (f$0) * (inverse f)$n" |
1019 by (simp add: field_simps) |
1019 by (simp add: field_simps) |
1020 have "(f * inverse f) $ n = (\<Sum>i = 0..n. f $i * natfun_inverse f (n - i))" |
1020 have "(f * inverse f) $ n = (\<Sum>i = 0..n. f $i * natfun_inverse f (n - i))" |
1021 unfolding fps_mult_nth ifn .. |
1021 unfolding fps_mult_nth ifn .. |
1022 also have "\<dots> = f$0 * natfun_inverse f n + (\<Sum>i = 1..n. f$i * natfun_inverse f (n-i))" |
1022 also have "\<dots> = f$0 * natfun_inverse f n + (\<Sum>i = 1..n. f$i * natfun_inverse f (n-i))" |
1023 by (simp add: eq) |
1023 by (simp add: eq) |
1075 qed |
1075 qed |
1076 |
1076 |
1077 lemma fps_inverse_eq_0: "f$0 = 0 \<Longrightarrow> inverse (f :: 'a :: division_ring fps) = 0" |
1077 lemma fps_inverse_eq_0: "f$0 = 0 \<Longrightarrow> inverse (f :: 'a :: division_ring fps) = 0" |
1078 by simp |
1078 by simp |
1079 |
1079 |
1080 lemma setsum_zero_lemma: |
1080 lemma sum_zero_lemma: |
1081 fixes n::nat |
1081 fixes n::nat |
1082 assumes "0 < n" |
1082 assumes "0 < n" |
1083 shows "(\<Sum>i = 0..n. if n = i then 1 else if n - i = 1 then - 1 else 0) = (0::'a::field)" |
1083 shows "(\<Sum>i = 0..n. if n = i then 1 else if n - i = 1 then - 1 else 0) = (0::'a::field)" |
1084 proof - |
1084 proof - |
1085 let ?f = "\<lambda>i. if n = i then 1 else if n - i = 1 then - 1 else 0" |
1085 let ?f = "\<lambda>i. if n = i then 1 else if n - i = 1 then - 1 else 0" |
1086 let ?g = "\<lambda>i. if i = n then 1 else if i = n - 1 then - 1 else 0" |
1086 let ?g = "\<lambda>i. if i = n then 1 else if i = n - 1 then - 1 else 0" |
1087 let ?h = "\<lambda>i. if i=n - 1 then - 1 else 0" |
1087 let ?h = "\<lambda>i. if i=n - 1 then - 1 else 0" |
1088 have th1: "setsum ?f {0..n} = setsum ?g {0..n}" |
1088 have th1: "sum ?f {0..n} = sum ?g {0..n}" |
1089 by (rule setsum.cong) auto |
1089 by (rule sum.cong) auto |
1090 have th2: "setsum ?g {0..n - 1} = setsum ?h {0..n - 1}" |
1090 have th2: "sum ?g {0..n - 1} = sum ?h {0..n - 1}" |
1091 apply (rule setsum.cong) |
1091 apply (rule sum.cong) |
1092 using assms |
1092 using assms |
1093 apply auto |
1093 apply auto |
1094 done |
1094 done |
1095 have eq: "{0 .. n} = {0.. n - 1} \<union> {n}" |
1095 have eq: "{0 .. n} = {0.. n - 1} \<union> {n}" |
1096 by auto |
1096 by auto |
1544 let ?Zn1 = "{0 .. n + 1}" |
1544 let ?Zn1 = "{0 .. n + 1}" |
1545 let ?g = "\<lambda>i. of_nat (i+1) * g $ (i+1) * f $ (n - i) + |
1545 let ?g = "\<lambda>i. of_nat (i+1) * g $ (i+1) * f $ (n - i) + |
1546 of_nat (i+1)* f $ (i+1) * g $ (n - i)" |
1546 of_nat (i+1)* f $ (i+1) * g $ (n - i)" |
1547 let ?h = "\<lambda>i. of_nat i * g $ i * f $ ((n+1) - i) + |
1547 let ?h = "\<lambda>i. of_nat i * g $ i * f $ ((n+1) - i) + |
1548 of_nat i* f $ i * g $ ((n + 1) - i)" |
1548 of_nat i* f $ i * g $ ((n + 1) - i)" |
1549 have s0: "setsum (\<lambda>i. of_nat i * f $ i * g $ (n + 1 - i)) ?Zn1 = |
1549 have s0: "sum (\<lambda>i. of_nat i * f $ i * g $ (n + 1 - i)) ?Zn1 = |
1550 setsum (\<lambda>i. of_nat (n + 1 - i) * f $ (n + 1 - i) * g $ i) ?Zn1" |
1550 sum (\<lambda>i. of_nat (n + 1 - i) * f $ (n + 1 - i) * g $ i) ?Zn1" |
1551 by (rule setsum.reindex_bij_witness[where i="op - (n + 1)" and j="op - (n + 1)"]) auto |
1551 by (rule sum.reindex_bij_witness[where i="op - (n + 1)" and j="op - (n + 1)"]) auto |
1552 have s1: "setsum (\<lambda>i. f $ i * g $ (n + 1 - i)) ?Zn1 = |
1552 have s1: "sum (\<lambda>i. f $ i * g $ (n + 1 - i)) ?Zn1 = |
1553 setsum (\<lambda>i. f $ (n + 1 - i) * g $ i) ?Zn1" |
1553 sum (\<lambda>i. f $ (n + 1 - i) * g $ i) ?Zn1" |
1554 by (rule setsum.reindex_bij_witness[where i="op - (n + 1)" and j="op - (n + 1)"]) auto |
1554 by (rule sum.reindex_bij_witness[where i="op - (n + 1)" and j="op - (n + 1)"]) auto |
1555 have "(f * ?D g + ?D f * g)$n = (?D g * f + ?D f * g)$n" |
1555 have "(f * ?D g + ?D f * g)$n = (?D g * f + ?D f * g)$n" |
1556 by (simp only: mult.commute) |
1556 by (simp only: mult.commute) |
1557 also have "\<dots> = (\<Sum>i = 0..n. ?g i)" |
1557 also have "\<dots> = (\<Sum>i = 0..n. ?g i)" |
1558 by (simp add: fps_mult_nth setsum.distrib[symmetric]) |
1558 by (simp add: fps_mult_nth sum.distrib[symmetric]) |
1559 also have "\<dots> = setsum ?h {0..n+1}" |
1559 also have "\<dots> = sum ?h {0..n+1}" |
1560 by (rule setsum.reindex_bij_witness_not_neutral |
1560 by (rule sum.reindex_bij_witness_not_neutral |
1561 [where S'="{}" and T'="{0}" and j="Suc" and i="\<lambda>i. i - 1"]) auto |
1561 [where S'="{}" and T'="{0}" and j="Suc" and i="\<lambda>i. i - 1"]) auto |
1562 also have "\<dots> = (fps_deriv (f * g)) $ n" |
1562 also have "\<dots> = (fps_deriv (f * g)) $ n" |
1563 apply (simp only: fps_deriv_nth fps_mult_nth setsum.distrib) |
1563 apply (simp only: fps_deriv_nth fps_mult_nth sum.distrib) |
1564 unfolding s0 s1 |
1564 unfolding s0 s1 |
1565 unfolding setsum.distrib[symmetric] setsum_distrib_left |
1565 unfolding sum.distrib[symmetric] sum_distrib_left |
1566 apply (rule setsum.cong) |
1566 apply (rule sum.cong) |
1567 apply (auto simp add: of_nat_diff field_simps) |
1567 apply (auto simp add: of_nat_diff field_simps) |
1568 done |
1568 done |
1569 finally show ?thesis . |
1569 finally show ?thesis . |
1570 qed |
1570 qed |
1571 then show ?thesis |
1571 then show ?thesis |
1944 |
1944 |
1945 |
1945 |
1946 subsection \<open>Composition of FPSs\<close> |
1946 subsection \<open>Composition of FPSs\<close> |
1947 |
1947 |
1948 definition fps_compose :: "'a::semiring_1 fps \<Rightarrow> 'a fps \<Rightarrow> 'a fps" (infixl "oo" 55) |
1948 definition fps_compose :: "'a::semiring_1 fps \<Rightarrow> 'a fps \<Rightarrow> 'a fps" (infixl "oo" 55) |
1949 where "a oo b = Abs_fps (\<lambda>n. setsum (\<lambda>i. a$i * (b^i$n)) {0..n})" |
1949 where "a oo b = Abs_fps (\<lambda>n. sum (\<lambda>i. a$i * (b^i$n)) {0..n})" |
1950 |
1950 |
1951 lemma fps_compose_nth: "(a oo b)$n = setsum (\<lambda>i. a$i * (b^i$n)) {0..n}" |
1951 lemma fps_compose_nth: "(a oo b)$n = sum (\<lambda>i. a$i * (b^i$n)) {0..n}" |
1952 by (simp add: fps_compose_def) |
1952 by (simp add: fps_compose_def) |
1953 |
1953 |
1954 lemma fps_compose_nth_0 [simp]: "(f oo g) $ 0 = f $ 0" |
1954 lemma fps_compose_nth_0 [simp]: "(f oo g) $ 0 = f $ 0" |
1955 by (simp add: fps_compose_nth) |
1955 by (simp add: fps_compose_nth) |
1956 |
1956 |
1957 lemma fps_compose_X[simp]: "a oo X = (a :: 'a::comm_ring_1 fps)" |
1957 lemma fps_compose_X[simp]: "a oo X = (a :: 'a::comm_ring_1 fps)" |
1958 by (simp add: fps_ext fps_compose_def mult_delta_right setsum.delta') |
1958 by (simp add: fps_ext fps_compose_def mult_delta_right sum.delta') |
1959 |
1959 |
1960 lemma fps_const_compose[simp]: "fps_const (a::'a::comm_ring_1) oo b = fps_const a" |
1960 lemma fps_const_compose[simp]: "fps_const (a::'a::comm_ring_1) oo b = fps_const a" |
1961 by (simp add: fps_eq_iff fps_compose_nth mult_delta_left setsum.delta) |
1961 by (simp add: fps_eq_iff fps_compose_nth mult_delta_left sum.delta) |
1962 |
1962 |
1963 lemma numeral_compose[simp]: "(numeral k :: 'a::comm_ring_1 fps) oo b = numeral k" |
1963 lemma numeral_compose[simp]: "(numeral k :: 'a::comm_ring_1 fps) oo b = numeral k" |
1964 unfolding numeral_fps_const by simp |
1964 unfolding numeral_fps_const by simp |
1965 |
1965 |
1966 lemma neg_numeral_compose[simp]: "(- numeral k :: 'a::comm_ring_1 fps) oo b = - numeral k" |
1966 lemma neg_numeral_compose[simp]: "(- numeral k :: 'a::comm_ring_1 fps) oo b = - numeral k" |
1967 unfolding neg_numeral_fps_const by simp |
1967 unfolding neg_numeral_fps_const by simp |
1968 |
1968 |
1969 lemma X_fps_compose_startby0[simp]: "a$0 = 0 \<Longrightarrow> X oo a = (a :: 'a::comm_ring_1 fps)" |
1969 lemma X_fps_compose_startby0[simp]: "a$0 = 0 \<Longrightarrow> X oo a = (a :: 'a::comm_ring_1 fps)" |
1970 by (simp add: fps_eq_iff fps_compose_def mult_delta_left setsum.delta not_le) |
1970 by (simp add: fps_eq_iff fps_compose_def mult_delta_left sum.delta not_le) |
1971 |
1971 |
1972 |
1972 |
1973 subsection \<open>Rules from Herbert Wilf's Generatingfunctionology\<close> |
1973 subsection \<open>Rules from Herbert Wilf's Generatingfunctionology\<close> |
1974 |
1974 |
1975 subsubsection \<open>Rule 1\<close> |
1975 subsubsection \<open>Rule 1\<close> |
1976 (* {a_{n+k}}_0^infty Corresponds to (f - setsum (\<lambda>i. a_i * x^i))/x^h, for h>0*) |
1976 (* {a_{n+k}}_0^infty Corresponds to (f - sum (\<lambda>i. a_i * x^i))/x^h, for h>0*) |
1977 |
1977 |
1978 lemma fps_power_mult_eq_shift: |
1978 lemma fps_power_mult_eq_shift: |
1979 "X^Suc k * Abs_fps (\<lambda>n. a (n + Suc k)) = |
1979 "X^Suc k * Abs_fps (\<lambda>n. a (n + Suc k)) = |
1980 Abs_fps a - setsum (\<lambda>i. fps_const (a i :: 'a::comm_ring_1) * X^i) {0 .. k}" |
1980 Abs_fps a - sum (\<lambda>i. fps_const (a i :: 'a::comm_ring_1) * X^i) {0 .. k}" |
1981 (is "?lhs = ?rhs") |
1981 (is "?lhs = ?rhs") |
1982 proof - |
1982 proof - |
1983 have "?lhs $ n = ?rhs $ n" for n :: nat |
1983 have "?lhs $ n = ?rhs $ n" for n :: nat |
1984 proof - |
1984 proof - |
1985 have "?lhs $ n = (if n < Suc k then 0 else a n)" |
1985 have "?lhs $ n = (if n < Suc k then 0 else a n)" |
1986 unfolding X_power_mult_nth by auto |
1986 unfolding X_power_mult_nth by auto |
1987 also have "\<dots> = ?rhs $ n" |
1987 also have "\<dots> = ?rhs $ n" |
1988 proof (induct k) |
1988 proof (induct k) |
1989 case 0 |
1989 case 0 |
1990 then show ?case |
1990 then show ?case |
1991 by (simp add: fps_setsum_nth) |
1991 by (simp add: fps_sum_nth) |
1992 next |
1992 next |
1993 case (Suc k) |
1993 case (Suc k) |
1994 have "(Abs_fps a - setsum (\<lambda>i. fps_const (a i :: 'a) * X^i) {0 .. Suc k})$n = |
1994 have "(Abs_fps a - sum (\<lambda>i. fps_const (a i :: 'a) * X^i) {0 .. Suc k})$n = |
1995 (Abs_fps a - setsum (\<lambda>i. fps_const (a i :: 'a) * X^i) {0 .. k} - |
1995 (Abs_fps a - sum (\<lambda>i. fps_const (a i :: 'a) * X^i) {0 .. k} - |
1996 fps_const (a (Suc k)) * X^ Suc k) $ n" |
1996 fps_const (a (Suc k)) * X^ Suc k) $ n" |
1997 by (simp add: field_simps) |
1997 by (simp add: field_simps) |
1998 also have "\<dots> = (if n < Suc k then 0 else a n) - (fps_const (a (Suc k)) * X^ Suc k)$n" |
1998 also have "\<dots> = (if n < Suc k then 0 else a n) - (fps_const (a (Suc k)) * X^ Suc k)$n" |
1999 using Suc.hyps[symmetric] unfolding fps_sub_nth by simp |
1999 using Suc.hyps[symmetric] unfolding fps_sub_nth by simp |
2000 also have "\<dots> = (if n < Suc (Suc k) then 0 else a n)" |
2000 also have "\<dots> = (if n < Suc (Suc k) then 0 else a n)" |
2069 by (auto simp: set_eq_iff) |
2069 by (auto simp: set_eq_iff) |
2070 have d: "{0} \<inter> ({1} \<union> {2..n}) = {}" "{1} \<inter> {2..n} = {}" "{0..n - 1} \<inter> {n} = {}" |
2070 have d: "{0} \<inter> ({1} \<union> {2..n}) = {}" "{1} \<inter> {2..n} = {}" "{0..n - 1} \<inter> {n} = {}" |
2071 using False by simp_all |
2071 using False by simp_all |
2072 have f: "finite {0}" "finite {1}" "finite {2 .. n}" |
2072 have f: "finite {0}" "finite {1}" "finite {2 .. n}" |
2073 "finite {0 .. n - 1}" "finite {n}" by simp_all |
2073 "finite {0 .. n - 1}" "finite {n}" by simp_all |
2074 have "((1 - X) * ?sa) $ n = setsum (\<lambda>i. (1 - X)$ i * ?sa $ (n - i)) {0 .. n}" |
2074 have "((1 - X) * ?sa) $ n = sum (\<lambda>i. (1 - X)$ i * ?sa $ (n - i)) {0 .. n}" |
2075 by (simp add: fps_mult_nth) |
2075 by (simp add: fps_mult_nth) |
2076 also have "\<dots> = a$n" |
2076 also have "\<dots> = a$n" |
2077 unfolding th0 |
2077 unfolding th0 |
2078 unfolding setsum.union_disjoint[OF f(1) finite_UnI[OF f(2,3)] d(1), unfolded u(1)] |
2078 unfolding sum.union_disjoint[OF f(1) finite_UnI[OF f(2,3)] d(1), unfolded u(1)] |
2079 unfolding setsum.union_disjoint[OF f(2) f(3) d(2)] |
2079 unfolding sum.union_disjoint[OF f(2) f(3) d(2)] |
2080 apply (simp) |
2080 apply (simp) |
2081 unfolding setsum.union_disjoint[OF f(4,5) d(3), unfolded u(3)] |
2081 unfolding sum.union_disjoint[OF f(4,5) d(3), unfolded u(3)] |
2082 apply simp |
2082 apply simp |
2083 done |
2083 done |
2084 finally show ?thesis |
2084 finally show ?thesis |
2085 by simp |
2085 by simp |
2086 qed |
2086 qed |
2087 then show ?thesis |
2087 then show ?thesis |
2088 unfolding fps_eq_iff by blast |
2088 unfolding fps_eq_iff by blast |
2089 qed |
2089 qed |
2090 |
2090 |
2091 lemma fps_divide_X_minus1_setsum: |
2091 lemma fps_divide_X_minus1_sum: |
2092 "a /((1::'a::field fps) - X) = Abs_fps (\<lambda>n. setsum (\<lambda>i. a $ i) {0..n})" |
2092 "a /((1::'a::field fps) - X) = Abs_fps (\<lambda>n. sum (\<lambda>i. a $ i) {0..n})" |
2093 proof - |
2093 proof - |
2094 let ?X = "1 - (X::'a fps)" |
2094 let ?X = "1 - (X::'a fps)" |
2095 have th0: "?X $ 0 \<noteq> 0" |
2095 have th0: "?X $ 0 \<noteq> 0" |
2096 by simp |
2096 by simp |
2097 have "a /?X = ?X * Abs_fps (\<lambda>n::nat. setsum (op $ a) {0..n}) * inverse ?X" |
2097 have "a /?X = ?X * Abs_fps (\<lambda>n::nat. sum (op $ a) {0..n}) * inverse ?X" |
2098 using fps_divide_X_minus1_setsum_lemma[of a, symmetric] th0 |
2098 using fps_divide_X_minus1_sum_lemma[of a, symmetric] th0 |
2099 by (simp add: fps_divide_def mult.assoc) |
2099 by (simp add: fps_divide_def mult.assoc) |
2100 also have "\<dots> = (inverse ?X * ?X) * Abs_fps (\<lambda>n::nat. setsum (op $ a) {0..n}) " |
2100 also have "\<dots> = (inverse ?X * ?X) * Abs_fps (\<lambda>n::nat. sum (op $ a) {0..n}) " |
2101 by (simp add: ac_simps) |
2101 by (simp add: ac_simps) |
2102 finally show ?thesis |
2102 finally show ?thesis |
2103 by (simp add: inverse_mult_eq_1[OF th0]) |
2103 by (simp add: inverse_mult_eq_1[OF th0]) |
2104 qed |
2104 qed |
2105 |
2105 |
2226 using i by auto |
2226 using i by auto |
2227 have f: "finite({0..k} - {i})" "finite {i}" |
2227 have f: "finite({0..k} - {i})" "finite {i}" |
2228 by auto |
2228 by auto |
2229 have d: "({0..k} - {i}) \<inter> {i} = {}" |
2229 have d: "({0..k} - {i}) \<inter> {i} = {}" |
2230 using i by auto |
2230 using i by auto |
2231 from H have "n = setsum (nth xs) {0..k}" |
2231 from H have "n = sum (nth xs) {0..k}" |
2232 apply (simp add: natpermute_def) |
2232 apply (simp add: natpermute_def) |
2233 apply (auto simp add: atLeastLessThanSuc_atLeastAtMost sum_list_setsum_nth) |
2233 apply (auto simp add: atLeastLessThanSuc_atLeastAtMost sum_list_sum_nth) |
2234 done |
2234 done |
2235 also have "\<dots> = n + setsum (nth xs) ({0..k} - {i})" |
2235 also have "\<dots> = n + sum (nth xs) ({0..k} - {i})" |
2236 unfolding setsum.union_disjoint[OF f d, unfolded eqs] using i by simp |
2236 unfolding sum.union_disjoint[OF f d, unfolded eqs] using i by simp |
2237 finally have zxs: "\<forall> j\<in> {0..k} - {i}. xs!j = 0" |
2237 finally have zxs: "\<forall> j\<in> {0..k} - {i}. xs!j = 0" |
2238 by auto |
2238 by auto |
2239 from H have xsl: "length xs = k+1" |
2239 from H have xsl: "length xs = k+1" |
2240 by (simp add: natpermute_def) |
2240 by (simp add: natpermute_def) |
2241 from i have i': "i < length (replicate (k+1) 0)" "i < k+1" |
2241 from i have i': "i < length (replicate (k+1) 0)" "i < k+1" |
2263 apply (rule set_update_memI) |
2263 apply (rule set_update_memI) |
2264 using i apply simp |
2264 using i apply simp |
2265 done |
2265 done |
2266 have xsl: "length xs = k + 1" |
2266 have xsl: "length xs = k + 1" |
2267 by (simp only: xs length_replicate length_list_update) |
2267 by (simp only: xs length_replicate length_list_update) |
2268 have "sum_list xs = setsum (nth xs) {0..<k+1}" |
2268 have "sum_list xs = sum (nth xs) {0..<k+1}" |
2269 unfolding sum_list_setsum_nth xsl .. |
2269 unfolding sum_list_sum_nth xsl .. |
2270 also have "\<dots> = setsum (\<lambda>j. if j = i then n else 0) {0..< k+1}" |
2270 also have "\<dots> = sum (\<lambda>j. if j = i then n else 0) {0..< k+1}" |
2271 by (rule setsum.cong) (simp_all add: xs del: replicate.simps) |
2271 by (rule sum.cong) (simp_all add: xs del: replicate.simps) |
2272 also have "\<dots> = n" using i by (simp add: setsum.delta) |
2272 also have "\<dots> = n" using i by (simp add: sum.delta) |
2273 finally have "xs \<in> natpermute n (k + 1)" |
2273 finally have "xs \<in> natpermute n (k + 1)" |
2274 using xsl unfolding natpermute_def mem_Collect_eq by blast |
2274 using xsl unfolding natpermute_def mem_Collect_eq by blast |
2275 then show "xs \<in> ?A" |
2275 then show "xs \<in> ?A" |
2276 using nxs by blast |
2276 using nxs by blast |
2277 qed |
2277 qed |
2307 unfolding fps_mult_nth H[rule_format, OF km] .. |
2307 unfolding fps_mult_nth H[rule_format, OF km] .. |
2308 also have "\<dots> = (\<Sum>v\<in>natpermute n (m + 1). \<Prod>j\<in>{0..m}. a j $ v ! j)" |
2308 also have "\<dots> = (\<Sum>v\<in>natpermute n (m + 1). \<Prod>j\<in>{0..m}. a j $ v ! j)" |
2309 apply (simp add: Suc) |
2309 apply (simp add: Suc) |
2310 unfolding natpermute_split[of m "m + 1", simplified, of n, |
2310 unfolding natpermute_split[of m "m + 1", simplified, of n, |
2311 unfolded natlist_trivial_1[unfolded One_nat_def] Suc] |
2311 unfolded natlist_trivial_1[unfolded One_nat_def] Suc] |
2312 apply (subst setsum.UNION_disjoint) |
2312 apply (subst sum.UNION_disjoint) |
2313 apply simp |
2313 apply simp |
2314 apply simp |
2314 apply simp |
2315 unfolding image_Collect[symmetric] |
2315 unfolding image_Collect[symmetric] |
2316 apply clarsimp |
2316 apply clarsimp |
2317 apply (rule finite_imageI) |
2317 apply (rule finite_imageI) |
2318 apply (rule natpermute_finite) |
2318 apply (rule natpermute_finite) |
2319 apply (clarsimp simp add: set_eq_iff) |
2319 apply (clarsimp simp add: set_eq_iff) |
2320 apply auto |
2320 apply auto |
2321 apply (rule setsum.cong) |
2321 apply (rule sum.cong) |
2322 apply (rule refl) |
2322 apply (rule refl) |
2323 unfolding setsum_distrib_right |
2323 unfolding sum_distrib_right |
2324 apply (rule sym) |
2324 apply (rule sym) |
2325 apply (rule_tac l = "\<lambda>xs. xs @ [n - x]" in setsum.reindex_cong) |
2325 apply (rule_tac l = "\<lambda>xs. xs @ [n - x]" in sum.reindex_cong) |
2326 apply (simp add: inj_on_def) |
2326 apply (simp add: inj_on_def) |
2327 apply auto |
2327 apply auto |
2328 unfolding setprod.union_disjoint[OF f0 d0, unfolded u0, unfolded Suc] |
2328 unfolding setprod.union_disjoint[OF f0 d0, unfolded u0, unfolded Suc] |
2329 apply (clarsimp simp add: natpermute_def nth_append) |
2329 apply (clarsimp simp add: natpermute_def nth_append) |
2330 done |
2330 done |
2334 |
2334 |
2335 text \<open>The special form for powers.\<close> |
2335 text \<open>The special form for powers.\<close> |
2336 lemma fps_power_nth_Suc: |
2336 lemma fps_power_nth_Suc: |
2337 fixes m :: nat |
2337 fixes m :: nat |
2338 and a :: "'a::comm_ring_1 fps" |
2338 and a :: "'a::comm_ring_1 fps" |
2339 shows "(a ^ Suc m)$n = setsum (\<lambda>v. setprod (\<lambda>j. a $ (v!j)) {0..m}) (natpermute n (m+1))" |
2339 shows "(a ^ Suc m)$n = sum (\<lambda>v. setprod (\<lambda>j. a $ (v!j)) {0..m}) (natpermute n (m+1))" |
2340 proof - |
2340 proof - |
2341 have th0: "a^Suc m = setprod (\<lambda>i. a) {0..m}" |
2341 have th0: "a^Suc m = setprod (\<lambda>i. a) {0..m}" |
2342 by (simp add: setprod_constant) |
2342 by (simp add: setprod_constant) |
2343 show ?thesis unfolding th0 fps_setprod_nth .. |
2343 show ?thesis unfolding th0 fps_setprod_nth .. |
2344 qed |
2344 qed |
2345 |
2345 |
2346 lemma fps_power_nth: |
2346 lemma fps_power_nth: |
2347 fixes m :: nat |
2347 fixes m :: nat |
2348 and a :: "'a::comm_ring_1 fps" |
2348 and a :: "'a::comm_ring_1 fps" |
2349 shows "(a ^m)$n = |
2349 shows "(a ^m)$n = |
2350 (if m=0 then 1$n else setsum (\<lambda>v. setprod (\<lambda>j. a $ (v!j)) {0..m - 1}) (natpermute n m))" |
2350 (if m=0 then 1$n else sum (\<lambda>v. setprod (\<lambda>j. a $ (v!j)) {0..m - 1}) (natpermute n m))" |
2351 by (cases m) (simp_all add: fps_power_nth_Suc del: power_Suc) |
2351 by (cases m) (simp_all add: fps_power_nth_Suc del: power_Suc) |
2352 |
2352 |
2353 lemma fps_nth_power_0: |
2353 lemma fps_nth_power_0: |
2354 fixes m :: nat |
2354 fixes m :: nat |
2355 and a :: "'a::comm_ring_1 fps" |
2355 and a :: "'a::comm_ring_1 fps" |
2421 by (auto simp: set_conv_nth A_def natpermute_def less_Suc_eq_le) |
2421 by (auto simp: set_conv_nth A_def natpermute_def less_Suc_eq_le) |
2422 then guess j by (elim exE conjE) note j = this |
2422 then guess j by (elim exE conjE) note j = this |
2423 |
2423 |
2424 from v have "k = sum_list v" by (simp add: A_def natpermute_def) |
2424 from v have "k = sum_list v" by (simp add: A_def natpermute_def) |
2425 also have "\<dots> = (\<Sum>i=0..m. v ! i)" |
2425 also have "\<dots> = (\<Sum>i=0..m. v ! i)" |
2426 by (simp add: sum_list_setsum_nth atLeastLessThanSuc_atLeastAtMost del: setsum_op_ivl_Suc) |
2426 by (simp add: sum_list_sum_nth atLeastLessThanSuc_atLeastAtMost del: sum_op_ivl_Suc) |
2427 also from j have "{0..m} = insert j ({0..m}-{j})" by auto |
2427 also from j have "{0..m} = insert j ({0..m}-{j})" by auto |
2428 also from j have "(\<Sum>i\<in>\<dots>. v ! i) = k + (\<Sum>i\<in>{0..m}-{j}. v ! i)" |
2428 also from j have "(\<Sum>i\<in>\<dots>. v ! i) = k + (\<Sum>i\<in>{0..m}-{j}. v ! i)" |
2429 by (subst setsum.insert) simp_all |
2429 by (subst sum.insert) simp_all |
2430 finally have "(\<Sum>i\<in>{0..m}-{j}. v ! i) = 0" by simp |
2430 finally have "(\<Sum>i\<in>{0..m}-{j}. v ! i) = 0" by simp |
2431 hence zero: "v ! i = 0" if "i \<in> {0..m}-{j}" for i using that |
2431 hence zero: "v ! i = 0" if "i \<in> {0..m}-{j}" for i using that |
2432 by (subst (asm) setsum_eq_0_iff) auto |
2432 by (subst (asm) sum_eq_0_iff) auto |
2433 |
2433 |
2434 from j have "{0..m} = insert j ({0..m} - {j})" by auto |
2434 from j have "{0..m} = insert j ({0..m} - {j})" by auto |
2435 also from j have "(\<Prod>i\<in>\<dots>. f $ (v ! i)) = f $ k * (\<Prod>i\<in>{0..m} - {j}. f $ (v ! i))" |
2435 also from j have "(\<Prod>i\<in>\<dots>. f $ (v ! i)) = f $ k * (\<Prod>i\<in>{0..m} - {j}. f $ (v ! i))" |
2436 by (subst setprod.insert) auto |
2436 by (subst setprod.insert) auto |
2437 also have "(\<Prod>i\<in>{0..m} - {j}. f $ (v ! i)) = (\<Prod>i\<in>{0..m} - {j}. f $ 0)" |
2437 also have "(\<Prod>i\<in>{0..m} - {j}. f $ (v ! i)) = (\<Prod>i\<in>{0..m} - {j}. f $ 0)" |
2443 have "(f ^ Suc m) $ k = (\<Sum>v\<in>natpermute k (m + 1). \<Prod>j = 0..m. f $ v ! j)" |
2443 have "(f ^ Suc m) $ k = (\<Sum>v\<in>natpermute k (m + 1). \<Prod>j = 0..m. f $ v ! j)" |
2444 by (rule fps_power_nth_Suc) |
2444 by (rule fps_power_nth_Suc) |
2445 also have "natpermute k (m+1) = A \<union> B" unfolding A_def B_def by blast |
2445 also have "natpermute k (m+1) = A \<union> B" unfolding A_def B_def by blast |
2446 also have "(\<Sum>v\<in>\<dots>. \<Prod>j = 0..m. f $ (v ! j)) = |
2446 also have "(\<Sum>v\<in>\<dots>. \<Prod>j = 0..m. f $ (v ! j)) = |
2447 (\<Sum>v\<in>A. \<Prod>j = 0..m. f $ (v ! j)) + (\<Sum>v\<in>B. \<Prod>j = 0..m. f $ (v ! j))" |
2447 (\<Sum>v\<in>A. \<Prod>j = 0..m. f $ (v ! j)) + (\<Sum>v\<in>B. \<Prod>j = 0..m. f $ (v ! j))" |
2448 by (intro setsum.union_disjoint) simp_all |
2448 by (intro sum.union_disjoint) simp_all |
2449 also have "(\<Sum>v\<in>A. \<Prod>j = 0..m. f $ (v ! j)) = of_nat (Suc m) * (f $ k * (f $ 0) ^ m)" |
2449 also have "(\<Sum>v\<in>A. \<Prod>j = 0..m. f $ (v ! j)) = of_nat (Suc m) * (f $ k * (f $ 0) ^ m)" |
2450 by (simp add: A card_A) |
2450 by (simp add: A card_A) |
2451 finally show ?thesis by (simp add: B_def) |
2451 finally show ?thesis by (simp add: B_def) |
2452 qed |
2452 qed |
2453 |
2453 |
2470 by (simp add: mult_ac del: power_Suc of_nat_Suc) |
2470 by (simp add: mult_ac del: power_Suc of_nat_Suc) |
2471 also have "v ! i < k" if "v \<in> {v\<in>natpermute k (m+1). k \<notin> set v}" "i \<le> m" for v i |
2471 also have "v ! i < k" if "v \<in> {v\<in>natpermute k (m+1). k \<notin> set v}" "i \<le> m" for v i |
2472 using that elem_le_sum_list_nat[of i v] unfolding natpermute_def |
2472 using that elem_le_sum_list_nat[of i v] unfolding natpermute_def |
2473 by (auto simp: set_conv_nth dest!: spec[of _ i]) |
2473 by (auto simp: set_conv_nth dest!: spec[of _ i]) |
2474 hence "?h f = ?h g" |
2474 hence "?h f = ?h g" |
2475 by (intro setsum.cong refl setprod.cong less lessI) (auto simp: natpermute_def) |
2475 by (intro sum.cong refl setprod.cong less lessI) (auto simp: natpermute_def) |
2476 finally have "f $ k * (of_nat (Suc m) * (f $ 0) ^ m) = g $ k * (of_nat (Suc m) * (f $ 0) ^ m)" |
2476 finally have "f $ k * (of_nat (Suc m) * (f $ 0) ^ m) = g $ k * (of_nat (Suc m) * (f $ 0) ^ m)" |
2477 by simp |
2477 by simp |
2478 with assms show "f $ k = g $ k" |
2478 with assms show "f $ k = g $ k" |
2479 by (subst (asm) mult_right_cancel) (auto simp del: of_nat_Suc) |
2479 by (subst (asm) mult_right_cancel) (auto simp del: of_nat_Suc) |
2480 qed (simp_all add: assms) |
2480 qed (simp_all add: assms) |
2542 case (Suc n1) |
2542 case (Suc n1) |
2543 have f: "finite {0 .. n1}" "finite {n}" by simp_all |
2543 have f: "finite {0 .. n1}" "finite {n}" by simp_all |
2544 have eq: "{0 .. n1} \<union> {n} = {0 .. n}" using Suc by auto |
2544 have eq: "{0 .. n1} \<union> {n} = {0 .. n}" using Suc by auto |
2545 have d: "{0 .. n1} \<inter> {n} = {}" using Suc by auto |
2545 have d: "{0 .. n1} \<inter> {n} = {}" using Suc by auto |
2546 have seq: "(\<Sum>i = 0..n1. b $ i * a ^ i $ n) = (\<Sum>i = 0..n1. c $ i * a ^ i $ n)" |
2546 have seq: "(\<Sum>i = 0..n1. b $ i * a ^ i $ n) = (\<Sum>i = 0..n1. c $ i * a ^ i $ n)" |
2547 apply (rule setsum.cong) |
2547 apply (rule sum.cong) |
2548 using H Suc |
2548 using H Suc |
2549 apply auto |
2549 apply auto |
2550 done |
2550 done |
2551 have th0: "(b oo a) $n = (\<Sum>i = 0..n1. c $ i * a ^ i $ n) + b$n * (a$1)^n" |
2551 have th0: "(b oo a) $n = (\<Sum>i = 0..n1. c $ i * a ^ i $ n) + b$n * (a$1)^n" |
2552 unfolding fps_compose_nth setsum.union_disjoint[OF f d, unfolded eq] seq |
2552 unfolding fps_compose_nth sum.union_disjoint[OF f d, unfolded eq] seq |
2553 using startsby_zero_power_nth_same[OF a0] |
2553 using startsby_zero_power_nth_same[OF a0] |
2554 by simp |
2554 by simp |
2555 have th1: "(c oo a) $n = (\<Sum>i = 0..n1. c $ i * a ^ i $ n) + c$n * (a$1)^n" |
2555 have th1: "(c oo a) $n = (\<Sum>i = 0..n1. c $ i * a ^ i $ n) + c$n * (a$1)^n" |
2556 unfolding fps_compose_nth setsum.union_disjoint[OF f d, unfolded eq] |
2556 unfolding fps_compose_nth sum.union_disjoint[OF f d, unfolded eq] |
2557 using startsby_zero_power_nth_same[OF a0] |
2557 using startsby_zero_power_nth_same[OF a0] |
2558 by simp |
2558 by simp |
2559 from \<open>?lhs\<close>[unfolded fps_eq_iff, rule_format, of n] th0 th1 a1 |
2559 from \<open>?lhs\<close>[unfolded fps_eq_iff, rule_format, of n] th0 th1 a1 |
2560 show ?thesis by auto |
2560 show ?thesis by auto |
2561 qed |
2561 qed |
2599 by auto |
2599 by auto |
2600 have eqs: "{0..<Suc k} = {0 ..< i} \<union> ({i} \<union> {i+1 ..< Suc k})" |
2600 have eqs: "{0..<Suc k} = {0 ..< i} \<union> ({i} \<union> {i+1 ..< Suc k})" |
2601 using i by auto |
2601 using i by auto |
2602 from xs have "Suc n = sum_list xs" |
2602 from xs have "Suc n = sum_list xs" |
2603 by (simp add: natpermute_def) |
2603 by (simp add: natpermute_def) |
2604 also have "\<dots> = setsum (nth xs) {0..<Suc k}" using xs |
2604 also have "\<dots> = sum (nth xs) {0..<Suc k}" using xs |
2605 by (simp add: natpermute_def sum_list_setsum_nth) |
2605 by (simp add: natpermute_def sum_list_sum_nth) |
2606 also have "\<dots> = xs!i + setsum (nth xs) {0..<i} + setsum (nth xs) {i+1..<Suc k}" |
2606 also have "\<dots> = xs!i + sum (nth xs) {0..<i} + sum (nth xs) {i+1..<Suc k}" |
2607 unfolding eqs setsum.union_disjoint[OF fths(1) finite_UnI[OF fths(2,3)] d(1)] |
2607 unfolding eqs sum.union_disjoint[OF fths(1) finite_UnI[OF fths(2,3)] d(1)] |
2608 unfolding setsum.union_disjoint[OF fths(2) fths(3) d(2)] |
2608 unfolding sum.union_disjoint[OF fths(2) fths(3) d(2)] |
2609 by simp |
2609 by simp |
2610 finally show ?thesis using c' by simp |
2610 finally show ?thesis using c' by simp |
2611 qed |
2611 qed |
2612 then show "((r, Suc k, a, xs!i), r, Suc k, a, Suc n) \<in> ?R" |
2612 then show "((r, Suc k, a, xs!i), r, Suc k, a, Suc n) \<in> ?R" |
2613 apply auto |
2613 apply auto |
2682 have d: "?Pnkn \<inter> ?Pnknn = {}" by blast |
2682 have d: "?Pnkn \<inter> ?Pnknn = {}" by blast |
2683 have f: "finite ?Pnkn" "finite ?Pnknn" |
2683 have f: "finite ?Pnkn" "finite ?Pnknn" |
2684 using finite_Un[of ?Pnkn ?Pnknn, unfolded eq] |
2684 using finite_Un[of ?Pnkn ?Pnknn, unfolded eq] |
2685 by (metis natpermute_finite)+ |
2685 by (metis natpermute_finite)+ |
2686 let ?f = "\<lambda>v. \<Prod>j\<in>{0..k}. ?r $ v ! j" |
2686 let ?f = "\<lambda>v. \<Prod>j\<in>{0..k}. ?r $ v ! j" |
2687 have "setsum ?f ?Pnkn = setsum (\<lambda>v. ?r $ n * r (Suc k) (a $ 0) ^ k) ?Pnkn" |
2687 have "sum ?f ?Pnkn = sum (\<lambda>v. ?r $ n * r (Suc k) (a $ 0) ^ k) ?Pnkn" |
2688 proof (rule setsum.cong) |
2688 proof (rule sum.cong) |
2689 fix v assume v: "v \<in> {xs \<in> natpermute n (k + 1). n \<in> set xs}" |
2689 fix v assume v: "v \<in> {xs \<in> natpermute n (k + 1). n \<in> set xs}" |
2690 let ?ths = "(\<Prod>j\<in>{0..k}. fps_radical r (Suc k) a $ v ! j) = |
2690 let ?ths = "(\<Prod>j\<in>{0..k}. fps_radical r (Suc k) a $ v ! j) = |
2691 fps_radical r (Suc k) a $ n * r (Suc k) (a $ 0) ^ k" |
2691 fps_radical r (Suc k) a $ n * r (Suc k) (a $ 0) ^ k" |
2692 from v obtain i where i: "i \<in> {0..k}" "v = replicate (k+1) 0 [i:= n]" |
2692 from v obtain i where i: "i \<in> {0..k}" "v = replicate (k+1) 0 [i:= n]" |
2693 unfolding natpermute_contain_maximal by auto |
2693 unfolding natpermute_contain_maximal by auto |
2699 done |
2699 done |
2700 also have "\<dots> = (fps_radical r (Suc k) a $ n) * r (Suc k) (a$0) ^ k" |
2700 also have "\<dots> = (fps_radical r (Suc k) a $ n) * r (Suc k) (a$0) ^ k" |
2701 using i r0 by (simp add: setprod_gen_delta) |
2701 using i r0 by (simp add: setprod_gen_delta) |
2702 finally show ?ths . |
2702 finally show ?ths . |
2703 qed rule |
2703 qed rule |
2704 then have "setsum ?f ?Pnkn = of_nat (k+1) * ?r $ n * r (Suc k) (a $ 0) ^ k" |
2704 then have "sum ?f ?Pnkn = of_nat (k+1) * ?r $ n * r (Suc k) (a $ 0) ^ k" |
2705 by (simp add: natpermute_max_card[OF \<open>n \<noteq> 0\<close>, simplified]) |
2705 by (simp add: natpermute_max_card[OF \<open>n \<noteq> 0\<close>, simplified]) |
2706 also have "\<dots> = a$n - setsum ?f ?Pnknn" |
2706 also have "\<dots> = a$n - sum ?f ?Pnknn" |
2707 unfolding Suc using r00 a0 by (simp add: field_simps fps_radical_def del: of_nat_Suc) |
2707 unfolding Suc using r00 a0 by (simp add: field_simps fps_radical_def del: of_nat_Suc) |
2708 finally have fn: "setsum ?f ?Pnkn = a$n - setsum ?f ?Pnknn" . |
2708 finally have fn: "sum ?f ?Pnkn = a$n - sum ?f ?Pnknn" . |
2709 have "(?r ^ Suc k)$n = setsum ?f ?Pnkn + setsum ?f ?Pnknn" |
2709 have "(?r ^ Suc k)$n = sum ?f ?Pnkn + sum ?f ?Pnknn" |
2710 unfolding fps_power_nth_Suc setsum.union_disjoint[OF f d, unfolded eq] .. |
2710 unfolding fps_power_nth_Suc sum.union_disjoint[OF f d, unfolded eq] .. |
2711 also have "\<dots> = a$n" unfolding fn by simp |
2711 also have "\<dots> = a$n" unfolding fn by simp |
2712 finally show ?thesis . |
2712 finally show ?thesis . |
2713 qed |
2713 qed |
2714 qed |
2714 qed |
2715 then show ?thesis using r0 by (simp add: fps_eq_iff) |
2715 then show ?thesis using r0 by (simp add: fps_eq_iff) |
2748 have d: "?Pnkn \<inter> ?Pnknn = {}" by blast |
2748 have d: "?Pnkn \<inter> ?Pnknn = {}" by blast |
2749 have f: "finite ?Pnkn" "finite ?Pnknn" |
2749 have f: "finite ?Pnkn" "finite ?Pnknn" |
2750 using finite_Un[of ?Pnkn ?Pnknn, unfolded eq] |
2750 using finite_Un[of ?Pnkn ?Pnknn, unfolded eq] |
2751 by (metis natpermute_finite)+ |
2751 by (metis natpermute_finite)+ |
2752 let ?f = "\<lambda>v. \<Prod>j\<in>{0..k}. ?r $ v ! j" |
2752 let ?f = "\<lambda>v. \<Prod>j\<in>{0..k}. ?r $ v ! j" |
2753 have "setsum ?f ?Pnkn = setsum (\<lambda>v. ?r $ n * r (Suc k) (a $ 0) ^ k) ?Pnkn" |
2753 have "sum ?f ?Pnkn = sum (\<lambda>v. ?r $ n * r (Suc k) (a $ 0) ^ k) ?Pnkn" |
2754 proof(rule setsum.cong2) |
2754 proof(rule sum.cong2) |
2755 fix v assume v: "v \<in> {xs \<in> natpermute n (k + 1). n \<in> set xs}" |
2755 fix v assume v: "v \<in> {xs \<in> natpermute n (k + 1). n \<in> set xs}" |
2756 let ?ths = "(\<Prod>j\<in>{0..k}. fps_radical r (Suc k) a $ v ! j) = fps_radical r (Suc k) a $ n * r (Suc k) (a $ 0) ^ k" |
2756 let ?ths = "(\<Prod>j\<in>{0..k}. fps_radical r (Suc k) a $ v ! j) = fps_radical r (Suc k) a $ n * r (Suc k) (a $ 0) ^ k" |
2757 from v obtain i where i: "i \<in> {0..k}" "v = replicate (k+1) 0 [i:= n]" |
2757 from v obtain i where i: "i \<in> {0..k}" "v = replicate (k+1) 0 [i:= n]" |
2758 unfolding natpermute_contain_maximal by auto |
2758 unfolding natpermute_contain_maximal by auto |
2759 have "(\<Prod>j\<in>{0..k}. fps_radical r (Suc k) a $ v ! j) = (\<Prod>j\<in>{0..k}. if j = i then fps_radical r (Suc k) a $ n else r (Suc k) (a$0))" |
2759 have "(\<Prod>j\<in>{0..k}. fps_radical r (Suc k) a $ v ! j) = (\<Prod>j\<in>{0..k}. if j = i then fps_radical r (Suc k) a $ n else r (Suc k) (a$0))" |
2761 using i r0 by (simp del: replicate.simps) |
2761 using i r0 by (simp del: replicate.simps) |
2762 also have "\<dots> = (fps_radical r (Suc k) a $ n) * r (Suc k) (a$0) ^ k" |
2762 also have "\<dots> = (fps_radical r (Suc k) a $ n) * r (Suc k) (a$0) ^ k" |
2763 unfolding setprod_gen_delta[OF fK] using i r0 by simp |
2763 unfolding setprod_gen_delta[OF fK] using i r0 by simp |
2764 finally show ?ths . |
2764 finally show ?ths . |
2765 qed |
2765 qed |
2766 then have "setsum ?f ?Pnkn = of_nat (k+1) * ?r $ n * r (Suc k) (a $ 0) ^ k" |
2766 then have "sum ?f ?Pnkn = of_nat (k+1) * ?r $ n * r (Suc k) (a $ 0) ^ k" |
2767 by (simp add: natpermute_max_card[OF nz, simplified]) |
2767 by (simp add: natpermute_max_card[OF nz, simplified]) |
2768 also have "\<dots> = a$n - setsum ?f ?Pnknn" |
2768 also have "\<dots> = a$n - sum ?f ?Pnknn" |
2769 unfolding n1 using r00 a0 by (simp add: field_simps fps_radical_def del: of_nat_Suc ) |
2769 unfolding n1 using r00 a0 by (simp add: field_simps fps_radical_def del: of_nat_Suc ) |
2770 finally have fn: "setsum ?f ?Pnkn = a$n - setsum ?f ?Pnknn" . |
2770 finally have fn: "sum ?f ?Pnkn = a$n - sum ?f ?Pnknn" . |
2771 have "(?r ^ Suc k)$n = setsum ?f ?Pnkn + setsum ?f ?Pnknn" |
2771 have "(?r ^ Suc k)$n = sum ?f ?Pnkn + sum ?f ?Pnknn" |
2772 unfolding fps_power_nth_Suc setsum.union_disjoint[OF f d, unfolded eq] .. |
2772 unfolding fps_power_nth_Suc sum.union_disjoint[OF f d, unfolded eq] .. |
2773 also have "\<dots> = a$n" unfolding fn by simp |
2773 also have "\<dots> = a$n" unfolding fn by simp |
2774 finally have "?r ^ Suc k $ n = a $n" .} |
2774 finally have "?r ^ Suc k $ n = a $n" .} |
2775 ultimately show "?r ^ Suc k $ n = a $n" by (cases n, auto) |
2775 ultimately show "?r ^ Suc k $ n = a $n" by (cases n, auto) |
2776 qed } |
2776 qed } |
2777 then show ?thesis by (simp add: fps_eq_iff) |
2777 then show ?thesis by (simp add: fps_eq_iff) |
2817 have f: "finite ?Pnkn" "finite ?Pnknn" |
2817 have f: "finite ?Pnkn" "finite ?Pnknn" |
2818 using finite_Un[of ?Pnkn ?Pnknn, unfolded eq] |
2818 using finite_Un[of ?Pnkn ?Pnknn, unfolded eq] |
2819 by (metis natpermute_finite)+ |
2819 by (metis natpermute_finite)+ |
2820 let ?f = "\<lambda>v. \<Prod>j\<in>{0..k}. ?r $ v ! j" |
2820 let ?f = "\<lambda>v. \<Prod>j\<in>{0..k}. ?r $ v ! j" |
2821 let ?g = "\<lambda>v. \<Prod>j\<in>{0..k}. a $ v ! j" |
2821 let ?g = "\<lambda>v. \<Prod>j\<in>{0..k}. a $ v ! j" |
2822 have "setsum ?g ?Pnkn = setsum (\<lambda>v. a $ n * (?r$0)^k) ?Pnkn" |
2822 have "sum ?g ?Pnkn = sum (\<lambda>v. a $ n * (?r$0)^k) ?Pnkn" |
2823 proof (rule setsum.cong) |
2823 proof (rule sum.cong) |
2824 fix v |
2824 fix v |
2825 assume v: "v \<in> {xs \<in> natpermute n (Suc k). n \<in> set xs}" |
2825 assume v: "v \<in> {xs \<in> natpermute n (Suc k). n \<in> set xs}" |
2826 let ?ths = "(\<Prod>j\<in>{0..k}. a $ v ! j) = a $ n * (?r$0)^k" |
2826 let ?ths = "(\<Prod>j\<in>{0..k}. a $ v ! j) = a $ n * (?r$0)^k" |
2827 from v obtain i where i: "i \<in> {0..k}" "v = replicate (k+1) 0 [i:= n]" |
2827 from v obtain i where i: "i \<in> {0..k}" "v = replicate (k+1) 0 [i:= n]" |
2828 unfolding Suc_eq_plus1 natpermute_contain_maximal |
2828 unfolding Suc_eq_plus1 natpermute_contain_maximal |
2834 done |
2834 done |
2835 also have "\<dots> = a $ n * (?r $ 0)^k" |
2835 also have "\<dots> = a $ n * (?r $ 0)^k" |
2836 using i by (simp add: setprod_gen_delta) |
2836 using i by (simp add: setprod_gen_delta) |
2837 finally show ?ths . |
2837 finally show ?ths . |
2838 qed rule |
2838 qed rule |
2839 then have th0: "setsum ?g ?Pnkn = of_nat (k+1) * a $ n * (?r $ 0)^k" |
2839 then have th0: "sum ?g ?Pnkn = of_nat (k+1) * a $ n * (?r $ 0)^k" |
2840 by (simp add: natpermute_max_card[OF nz, simplified]) |
2840 by (simp add: natpermute_max_card[OF nz, simplified]) |
2841 have th1: "setsum ?g ?Pnknn = setsum ?f ?Pnknn" |
2841 have th1: "sum ?g ?Pnknn = sum ?f ?Pnknn" |
2842 proof (rule setsum.cong, rule refl, rule setprod.cong, simp) |
2842 proof (rule sum.cong, rule refl, rule setprod.cong, simp) |
2843 fix xs i |
2843 fix xs i |
2844 assume xs: "xs \<in> ?Pnknn" and i: "i \<in> {0..k}" |
2844 assume xs: "xs \<in> ?Pnknn" and i: "i \<in> {0..k}" |
2845 have False if c: "n \<le> xs ! i" |
2845 have False if c: "n \<le> xs ! i" |
2846 proof - |
2846 proof - |
2847 from xs i have "xs ! i \<noteq> n" |
2847 from xs i have "xs ! i \<noteq> n" |
2853 by auto |
2853 by auto |
2854 have eqs: "{0..<Suc k} = {0 ..< i} \<union> ({i} \<union> {i+1 ..< Suc k})" |
2854 have eqs: "{0..<Suc k} = {0 ..< i} \<union> ({i} \<union> {i+1 ..< Suc k})" |
2855 using i by auto |
2855 using i by auto |
2856 from xs have "n = sum_list xs" |
2856 from xs have "n = sum_list xs" |
2857 by (simp add: natpermute_def) |
2857 by (simp add: natpermute_def) |
2858 also have "\<dots> = setsum (nth xs) {0..<Suc k}" |
2858 also have "\<dots> = sum (nth xs) {0..<Suc k}" |
2859 using xs by (simp add: natpermute_def sum_list_setsum_nth) |
2859 using xs by (simp add: natpermute_def sum_list_sum_nth) |
2860 also have "\<dots> = xs!i + setsum (nth xs) {0..<i} + setsum (nth xs) {i+1..<Suc k}" |
2860 also have "\<dots> = xs!i + sum (nth xs) {0..<i} + sum (nth xs) {i+1..<Suc k}" |
2861 unfolding eqs setsum.union_disjoint[OF fths(1) finite_UnI[OF fths(2,3)] d(1)] |
2861 unfolding eqs sum.union_disjoint[OF fths(1) finite_UnI[OF fths(2,3)] d(1)] |
2862 unfolding setsum.union_disjoint[OF fths(2) fths(3) d(2)] |
2862 unfolding sum.union_disjoint[OF fths(2) fths(3) d(2)] |
2863 by simp |
2863 by simp |
2864 finally show ?thesis using c' by simp |
2864 finally show ?thesis using c' by simp |
2865 qed |
2865 qed |
2866 then have thn: "xs!i < n" by presburger |
2866 then have thn: "xs!i < n" by presburger |
2867 from h[rule_format, OF thn] show "a$(xs !i) = ?r$(xs!i)" . |
2867 from h[rule_format, OF thn] show "a$(xs !i) = ?r$(xs!i)" . |
2868 qed |
2868 qed |
2869 have th00: "\<And>x::'a. of_nat (Suc k) * (x * inverse (of_nat (Suc k))) = x" |
2869 have th00: "\<And>x::'a. of_nat (Suc k) * (x * inverse (of_nat (Suc k))) = x" |
2870 by (simp add: field_simps del: of_nat_Suc) |
2870 by (simp add: field_simps del: of_nat_Suc) |
2871 from \<open>?lhs\<close> have "b$n = a^Suc k $ n" |
2871 from \<open>?lhs\<close> have "b$n = a^Suc k $ n" |
2872 by (simp add: fps_eq_iff) |
2872 by (simp add: fps_eq_iff) |
2873 also have "a ^ Suc k$n = setsum ?g ?Pnkn + setsum ?g ?Pnknn" |
2873 also have "a ^ Suc k$n = sum ?g ?Pnkn + sum ?g ?Pnknn" |
2874 unfolding fps_power_nth_Suc |
2874 unfolding fps_power_nth_Suc |
2875 using setsum.union_disjoint[OF f d, unfolded Suc_eq_plus1[symmetric], |
2875 using sum.union_disjoint[OF f d, unfolded Suc_eq_plus1[symmetric], |
2876 unfolded eq, of ?g] by simp |
2876 unfolded eq, of ?g] by simp |
2877 also have "\<dots> = of_nat (k+1) * a $ n * (?r $ 0)^k + setsum ?f ?Pnknn" |
2877 also have "\<dots> = of_nat (k+1) * a $ n * (?r $ 0)^k + sum ?f ?Pnknn" |
2878 unfolding th0 th1 .. |
2878 unfolding th0 th1 .. |
2879 finally have "of_nat (k+1) * a $ n * (?r $ 0)^k = b$n - setsum ?f ?Pnknn" |
2879 finally have "of_nat (k+1) * a $ n * (?r $ 0)^k = b$n - sum ?f ?Pnknn" |
2880 by simp |
2880 by simp |
2881 then have "a$n = (b$n - setsum ?f ?Pnknn) / (of_nat (k+1) * (?r $ 0)^k)" |
2881 then have "a$n = (b$n - sum ?f ?Pnknn) / (of_nat (k+1) * (?r $ 0)^k)" |
2882 apply - |
2882 apply - |
2883 apply (rule eq_divide_imp') |
2883 apply (rule eq_divide_imp') |
2884 using r00 |
2884 using r00 |
2885 apply (simp del: of_nat_Suc) |
2885 apply (simp del: of_nat_Suc) |
2886 apply (simp add: ac_simps) |
2886 apply (simp add: ac_simps) |
3079 assumes b0: "b$0 = 0" |
3079 assumes b0: "b$0 = 0" |
3080 shows "fps_deriv (a oo b) = ((fps_deriv a) oo b) * fps_deriv b" |
3080 shows "fps_deriv (a oo b) = ((fps_deriv a) oo b) * fps_deriv b" |
3081 proof - |
3081 proof - |
3082 have "(fps_deriv (a oo b))$n = (((fps_deriv a) oo b) * (fps_deriv b)) $n" for n |
3082 have "(fps_deriv (a oo b))$n = (((fps_deriv a) oo b) * (fps_deriv b)) $n" for n |
3083 proof - |
3083 proof - |
3084 have "(fps_deriv (a oo b))$n = setsum (\<lambda>i. a $ i * (fps_deriv (b^i))$n) {0.. Suc n}" |
3084 have "(fps_deriv (a oo b))$n = sum (\<lambda>i. a $ i * (fps_deriv (b^i))$n) {0.. Suc n}" |
3085 by (simp add: fps_compose_def field_simps setsum_distrib_left del: of_nat_Suc) |
3085 by (simp add: fps_compose_def field_simps sum_distrib_left del: of_nat_Suc) |
3086 also have "\<dots> = setsum (\<lambda>i. a$i * ((fps_const (of_nat i)) * (fps_deriv b * (b^(i - 1))))$n) {0.. Suc n}" |
3086 also have "\<dots> = sum (\<lambda>i. a$i * ((fps_const (of_nat i)) * (fps_deriv b * (b^(i - 1))))$n) {0.. Suc n}" |
3087 by (simp add: field_simps fps_deriv_power del: fps_mult_left_const_nth of_nat_Suc) |
3087 by (simp add: field_simps fps_deriv_power del: fps_mult_left_const_nth of_nat_Suc) |
3088 also have "\<dots> = setsum (\<lambda>i. of_nat i * a$i * (((b^(i - 1)) * fps_deriv b))$n) {0.. Suc n}" |
3088 also have "\<dots> = sum (\<lambda>i. of_nat i * a$i * (((b^(i - 1)) * fps_deriv b))$n) {0.. Suc n}" |
3089 unfolding fps_mult_left_const_nth by (simp add: field_simps) |
3089 unfolding fps_mult_left_const_nth by (simp add: field_simps) |
3090 also have "\<dots> = setsum (\<lambda>i. of_nat i * a$i * (setsum (\<lambda>j. (b^ (i - 1))$j * (fps_deriv b)$(n - j)) {0..n})) {0.. Suc n}" |
3090 also have "\<dots> = sum (\<lambda>i. of_nat i * a$i * (sum (\<lambda>j. (b^ (i - 1))$j * (fps_deriv b)$(n - j)) {0..n})) {0.. Suc n}" |
3091 unfolding fps_mult_nth .. |
3091 unfolding fps_mult_nth .. |
3092 also have "\<dots> = setsum (\<lambda>i. of_nat i * a$i * (setsum (\<lambda>j. (b^ (i - 1))$j * (fps_deriv b)$(n - j)) {0..n})) {1.. Suc n}" |
3092 also have "\<dots> = sum (\<lambda>i. of_nat i * a$i * (sum (\<lambda>j. (b^ (i - 1))$j * (fps_deriv b)$(n - j)) {0..n})) {1.. Suc n}" |
3093 apply (rule setsum.mono_neutral_right) |
3093 apply (rule sum.mono_neutral_right) |
3094 apply (auto simp add: mult_delta_left setsum.delta not_le) |
3094 apply (auto simp add: mult_delta_left sum.delta not_le) |
3095 done |
3095 done |
3096 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}" |
3096 also have "\<dots> = sum (\<lambda>i. of_nat (i + 1) * a$(i+1) * (sum (\<lambda>j. (b^ i)$j * of_nat (n - j + 1) * b$(n - j + 1)) {0..n})) {0.. n}" |
3097 unfolding fps_deriv_nth |
3097 unfolding fps_deriv_nth |
3098 by (rule setsum.reindex_cong [of Suc]) (auto simp add: mult.assoc) |
3098 by (rule sum.reindex_cong [of Suc]) (auto simp add: mult.assoc) |
3099 finally have th0: "(fps_deriv (a oo b))$n = |
3099 finally have th0: "(fps_deriv (a oo b))$n = |
3100 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}" . |
3100 sum (\<lambda>i. of_nat (i + 1) * a$(i+1) * (sum (\<lambda>j. (b^ i)$j * of_nat (n - j + 1) * b$(n - j + 1)) {0..n})) {0.. n}" . |
3101 |
3101 |
3102 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}" |
3102 have "(((fps_deriv a) oo b) * (fps_deriv b))$n = sum (\<lambda>i. (fps_deriv b)$ (n - i) * ((fps_deriv a) oo b)$i) {0..n}" |
3103 unfolding fps_mult_nth by (simp add: ac_simps) |
3103 unfolding fps_mult_nth by (simp add: ac_simps) |
3104 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}" |
3104 also have "\<dots> = sum (\<lambda>i. sum (\<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}" |
3105 unfolding fps_deriv_nth fps_compose_nth setsum_distrib_left mult.assoc |
3105 unfolding fps_deriv_nth fps_compose_nth sum_distrib_left mult.assoc |
3106 apply (rule setsum.cong) |
3106 apply (rule sum.cong) |
3107 apply (rule refl) |
3107 apply (rule refl) |
3108 apply (rule setsum.mono_neutral_left) |
3108 apply (rule sum.mono_neutral_left) |
3109 apply (simp_all add: subset_eq) |
3109 apply (simp_all add: subset_eq) |
3110 apply clarify |
3110 apply clarify |
3111 apply (subgoal_tac "b^i$x = 0") |
3111 apply (subgoal_tac "b^i$x = 0") |
3112 apply simp |
3112 apply simp |
3113 apply (rule startsby_zero_power_prefix[OF b0, rule_format]) |
3113 apply (rule startsby_zero_power_prefix[OF b0, rule_format]) |
3114 apply simp |
3114 apply simp |
3115 done |
3115 done |
3116 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}" |
3116 also have "\<dots> = sum (\<lambda>i. of_nat (i + 1) * a$(i+1) * (sum (\<lambda>j. (b^ i)$j * of_nat (n - j + 1) * b$(n - j + 1)) {0..n})) {0.. n}" |
3117 unfolding setsum_distrib_left |
3117 unfolding sum_distrib_left |
3118 apply (subst setsum.commute) |
3118 apply (subst sum.commute) |
3119 apply (rule setsum.cong, rule refl)+ |
3119 apply (rule sum.cong, rule refl)+ |
3120 apply simp |
3120 apply simp |
3121 done |
3121 done |
3122 finally show ?thesis |
3122 finally show ?thesis |
3123 unfolding th0 by simp |
3123 unfolding th0 by simp |
3124 qed |
3124 qed |
3131 case 0 |
3131 case 0 |
3132 then show ?thesis |
3132 then show ?thesis |
3133 by (simp add: fps_mult_nth) |
3133 by (simp add: fps_mult_nth) |
3134 next |
3134 next |
3135 case (Suc m) |
3135 case (Suc m) |
3136 have "((1 + X)*a) $ n = setsum (\<lambda>i. (1 + X) $ i * a $ (n - i)) {0..n}" |
3136 have "((1 + X)*a) $ n = sum (\<lambda>i. (1 + X) $ i * a $ (n - i)) {0..n}" |
3137 by (simp add: fps_mult_nth) |
3137 by (simp add: fps_mult_nth) |
3138 also have "\<dots> = setsum (\<lambda>i. (1+X)$i * a$(n-i)) {0.. 1}" |
3138 also have "\<dots> = sum (\<lambda>i. (1+X)$i * a$(n-i)) {0.. 1}" |
3139 unfolding Suc by (rule setsum.mono_neutral_right) auto |
3139 unfolding Suc by (rule sum.mono_neutral_right) auto |
3140 also have "\<dots> = (if n = 0 then (a$n :: 'a::comm_ring_1) else a$n + a$(n - 1))" |
3140 also have "\<dots> = (if n = 0 then (a$n :: 'a::comm_ring_1) else a$n + a$(n - 1))" |
3141 by (simp add: Suc) |
3141 by (simp add: Suc) |
3142 finally show ?thesis . |
3142 finally show ?thesis . |
3143 qed |
3143 qed |
3144 |
3144 |
3145 |
3145 |
3146 subsection \<open>Finite FPS (i.e. polynomials) and X\<close> |
3146 subsection \<open>Finite FPS (i.e. polynomials) and X\<close> |
3147 |
3147 |
3148 lemma fps_poly_sum_X: |
3148 lemma fps_poly_sum_X: |
3149 assumes "\<forall>i > n. a$i = (0::'a::comm_ring_1)" |
3149 assumes "\<forall>i > n. a$i = (0::'a::comm_ring_1)" |
3150 shows "a = setsum (\<lambda>i. fps_const (a$i) * X^i) {0..n}" (is "a = ?r") |
3150 shows "a = sum (\<lambda>i. fps_const (a$i) * X^i) {0..n}" (is "a = ?r") |
3151 proof - |
3151 proof - |
3152 have "a$i = ?r$i" for i |
3152 have "a$i = ?r$i" for i |
3153 unfolding fps_setsum_nth fps_mult_left_const_nth X_power_nth |
3153 unfolding fps_sum_nth fps_mult_left_const_nth X_power_nth |
3154 by (simp add: mult_delta_right setsum.delta' assms) |
3154 by (simp add: mult_delta_right sum.delta' assms) |
3155 then show ?thesis |
3155 then show ?thesis |
3156 unfolding fps_eq_iff by blast |
3156 unfolding fps_eq_iff by blast |
3157 qed |
3157 qed |
3158 |
3158 |
3159 |
3159 |
3182 case 0 |
3182 case 0 |
3183 then show ?thesis using a0 |
3183 then show ?thesis using a0 |
3184 by (simp add: fps_compose_nth fps_inv_def) |
3184 by (simp add: fps_compose_nth fps_inv_def) |
3185 next |
3185 next |
3186 case (Suc n1) |
3186 case (Suc n1) |
3187 have "?i $ n = setsum (\<lambda>i. (fps_inv a $ i) * (a^i)$n) {0 .. n1} + fps_inv a $ Suc n1 * (a $ 1)^ Suc n1" |
3187 have "?i $ n = sum (\<lambda>i. (fps_inv a $ i) * (a^i)$n) {0 .. n1} + fps_inv a $ Suc n1 * (a $ 1)^ Suc n1" |
3188 by (simp only: fps_compose_nth) (simp add: Suc startsby_zero_power_nth_same [OF a0] del: power_Suc) |
3188 by (simp only: fps_compose_nth) (simp add: Suc startsby_zero_power_nth_same [OF a0] del: power_Suc) |
3189 also have "\<dots> = setsum (\<lambda>i. (fps_inv a $ i) * (a^i)$n) {0 .. n1} + |
3189 also have "\<dots> = sum (\<lambda>i. (fps_inv a $ i) * (a^i)$n) {0 .. n1} + |
3190 (X$ Suc n1 - setsum (\<lambda>i. (fps_inv a $ i) * (a^i)$n) {0 .. n1})" |
3190 (X$ Suc n1 - sum (\<lambda>i. (fps_inv a $ i) * (a^i)$n) {0 .. n1})" |
3191 using a0 a1 Suc by (simp add: fps_inv_def) |
3191 using a0 a1 Suc by (simp add: fps_inv_def) |
3192 also have "\<dots> = X$n" using Suc by simp |
3192 also have "\<dots> = X$n" using Suc by simp |
3193 finally show ?thesis . |
3193 finally show ?thesis . |
3194 qed |
3194 qed |
3195 qed |
3195 qed |
3221 case 0 |
3221 case 0 |
3222 then show ?thesis using a0 |
3222 then show ?thesis using a0 |
3223 by (simp add: fps_compose_nth fps_ginv_def) |
3223 by (simp add: fps_compose_nth fps_ginv_def) |
3224 next |
3224 next |
3225 case (Suc n1) |
3225 case (Suc n1) |
3226 have "?i $ n = setsum (\<lambda>i. (fps_ginv b a $ i) * (a^i)$n) {0 .. n1} + fps_ginv b a $ Suc n1 * (a $ 1)^ Suc n1" |
3226 have "?i $ n = sum (\<lambda>i. (fps_ginv b a $ i) * (a^i)$n) {0 .. n1} + fps_ginv b a $ Suc n1 * (a $ 1)^ Suc n1" |
3227 by (simp only: fps_compose_nth) (simp add: Suc startsby_zero_power_nth_same [OF a0] del: power_Suc) |
3227 by (simp only: fps_compose_nth) (simp add: Suc startsby_zero_power_nth_same [OF a0] del: power_Suc) |
3228 also have "\<dots> = setsum (\<lambda>i. (fps_ginv b a $ i) * (a^i)$n) {0 .. n1} + |
3228 also have "\<dots> = sum (\<lambda>i. (fps_ginv b a $ i) * (a^i)$n) {0 .. n1} + |
3229 (b$ Suc n1 - setsum (\<lambda>i. (fps_ginv b a $ i) * (a^i)$n) {0 .. n1})" |
3229 (b$ Suc n1 - sum (\<lambda>i. (fps_ginv b a $ i) * (a^i)$n) {0 .. n1})" |
3230 using a0 a1 Suc by (simp add: fps_ginv_def) |
3230 using a0 a1 Suc by (simp add: fps_ginv_def) |
3231 also have "\<dots> = b$n" using Suc by simp |
3231 also have "\<dots> = b$n" using Suc by simp |
3232 finally show ?thesis . |
3232 finally show ?thesis . |
3233 qed |
3233 qed |
3234 qed |
3234 qed |
3244 apply simp |
3244 apply simp |
3245 apply simp |
3245 apply simp |
3246 done |
3246 done |
3247 |
3247 |
3248 lemma fps_compose_1[simp]: "1 oo a = 1" |
3248 lemma fps_compose_1[simp]: "1 oo a = 1" |
3249 by (simp add: fps_eq_iff fps_compose_nth mult_delta_left setsum.delta) |
3249 by (simp add: fps_eq_iff fps_compose_nth mult_delta_left sum.delta) |
3250 |
3250 |
3251 lemma fps_compose_0[simp]: "0 oo a = 0" |
3251 lemma fps_compose_0[simp]: "0 oo a = 0" |
3252 by (simp add: fps_eq_iff fps_compose_nth) |
3252 by (simp add: fps_eq_iff fps_compose_nth) |
3253 |
3253 |
3254 lemma fps_compose_0_right[simp]: "a oo 0 = fps_const (a $ 0)" |
3254 lemma fps_compose_0_right[simp]: "a oo 0 = fps_const (a $ 0)" |
3255 by (auto simp add: fps_eq_iff fps_compose_nth power_0_left setsum.neutral) |
3255 by (auto simp add: fps_eq_iff fps_compose_nth power_0_left sum.neutral) |
3256 |
3256 |
3257 lemma fps_compose_add_distrib: "(a + b) oo c = (a oo c) + (b oo c)" |
3257 lemma fps_compose_add_distrib: "(a + b) oo c = (a oo c) + (b oo c)" |
3258 by (simp add: fps_eq_iff fps_compose_nth field_simps setsum.distrib) |
3258 by (simp add: fps_eq_iff fps_compose_nth field_simps sum.distrib) |
3259 |
3259 |
3260 lemma fps_compose_setsum_distrib: "(setsum f S) oo a = setsum (\<lambda>i. f i oo a) S" |
3260 lemma fps_compose_sum_distrib: "(sum f S) oo a = sum (\<lambda>i. f i oo a) S" |
3261 proof (cases "finite S") |
3261 proof (cases "finite S") |
3262 case True |
3262 case True |
3263 show ?thesis |
3263 show ?thesis |
3264 proof (rule finite_induct[OF True]) |
3264 proof (rule finite_induct[OF True]) |
3265 show "setsum f {} oo a = (\<Sum>i\<in>{}. f i oo a)" |
3265 show "sum f {} oo a = (\<Sum>i\<in>{}. f i oo a)" |
3266 by simp |
3266 by simp |
3267 next |
3267 next |
3268 fix x F |
3268 fix x F |
3269 assume fF: "finite F" |
3269 assume fF: "finite F" |
3270 and xF: "x \<notin> F" |
3270 and xF: "x \<notin> F" |
3271 and h: "setsum f F oo a = setsum (\<lambda>i. f i oo a) F" |
3271 and h: "sum f F oo a = sum (\<lambda>i. f i oo a) F" |
3272 show "setsum f (insert x F) oo a = setsum (\<lambda>i. f i oo a) (insert x F)" |
3272 show "sum f (insert x F) oo a = sum (\<lambda>i. f i oo a) (insert x F)" |
3273 using fF xF h by (simp add: fps_compose_add_distrib) |
3273 using fF xF h by (simp add: fps_compose_add_distrib) |
3274 qed |
3274 qed |
3275 next |
3275 next |
3276 case False |
3276 case False |
3277 then show ?thesis by simp |
3277 then show ?thesis by simp |
3278 qed |
3278 qed |
3279 |
3279 |
3280 lemma convolution_eq: |
3280 lemma convolution_eq: |
3281 "setsum (\<lambda>i. a (i :: nat) * b (n - i)) {0 .. n} = |
3281 "sum (\<lambda>i. a (i :: nat) * b (n - i)) {0 .. n} = |
3282 setsum (\<lambda>(i,j). a i * b j) {(i,j). i \<le> n \<and> j \<le> n \<and> i + j = n}" |
3282 sum (\<lambda>(i,j). a i * b j) {(i,j). i \<le> n \<and> j \<le> n \<and> i + j = n}" |
3283 by (rule setsum.reindex_bij_witness[where i=fst and j="\<lambda>i. (i, n - i)"]) auto |
3283 by (rule sum.reindex_bij_witness[where i=fst and j="\<lambda>i. (i, n - i)"]) auto |
3284 |
3284 |
3285 lemma product_composition_lemma: |
3285 lemma product_composition_lemma: |
3286 assumes c0: "c$0 = (0::'a::idom)" |
3286 assumes c0: "c$0 = (0::'a::idom)" |
3287 and d0: "d$0 = 0" |
3287 and d0: "d$0 = 0" |
3288 shows "((a oo c) * (b oo d))$n = |
3288 shows "((a oo c) * (b oo d))$n = |
3289 setsum (\<lambda>(k,m). a$k * b$m * (c^k * d^m) $ n) {(k,m). k + m \<le> n}" (is "?l = ?r") |
3289 sum (\<lambda>(k,m). a$k * b$m * (c^k * d^m) $ n) {(k,m). k + m \<le> n}" (is "?l = ?r") |
3290 proof - |
3290 proof - |
3291 let ?S = "{(k::nat, m::nat). k + m \<le> n}" |
3291 let ?S = "{(k::nat, m::nat). k + m \<le> n}" |
3292 have s: "?S \<subseteq> {0..n} \<times> {0..n}" by (auto simp add: subset_eq) |
3292 have s: "?S \<subseteq> {0..n} \<times> {0..n}" by (auto simp add: subset_eq) |
3293 have f: "finite {(k::nat, m::nat). k + m \<le> n}" |
3293 have f: "finite {(k::nat, m::nat). k + m \<le> n}" |
3294 apply (rule finite_subset[OF s]) |
3294 apply (rule finite_subset[OF s]) |
3295 apply auto |
3295 apply auto |
3296 done |
3296 done |
3297 have "?r = setsum (\<lambda>i. setsum (\<lambda>(k,m). a$k * (c^k)$i * b$m * (d^m) $ (n - i)) {(k,m). k + m \<le> n}) {0..n}" |
3297 have "?r = sum (\<lambda>i. sum (\<lambda>(k,m). a$k * (c^k)$i * b$m * (d^m) $ (n - i)) {(k,m). k + m \<le> n}) {0..n}" |
3298 apply (simp add: fps_mult_nth setsum_distrib_left) |
3298 apply (simp add: fps_mult_nth sum_distrib_left) |
3299 apply (subst setsum.commute) |
3299 apply (subst sum.commute) |
3300 apply (rule setsum.cong) |
3300 apply (rule sum.cong) |
3301 apply (auto simp add: field_simps) |
3301 apply (auto simp add: field_simps) |
3302 done |
3302 done |
3303 also have "\<dots> = ?l" |
3303 also have "\<dots> = ?l" |
3304 apply (simp add: fps_mult_nth fps_compose_nth setsum_product) |
3304 apply (simp add: fps_mult_nth fps_compose_nth sum_product) |
3305 apply (rule setsum.cong) |
3305 apply (rule sum.cong) |
3306 apply (rule refl) |
3306 apply (rule refl) |
3307 apply (simp add: setsum.cartesian_product mult.assoc) |
3307 apply (simp add: sum.cartesian_product mult.assoc) |
3308 apply (rule setsum.mono_neutral_right[OF f]) |
3308 apply (rule sum.mono_neutral_right[OF f]) |
3309 apply (simp add: subset_eq) |
3309 apply (simp add: subset_eq) |
3310 apply presburger |
3310 apply presburger |
3311 apply clarsimp |
3311 apply clarsimp |
3312 apply (rule ccontr) |
3312 apply (rule ccontr) |
3313 apply (clarsimp simp add: not_le) |
3313 apply (clarsimp simp add: not_le) |
3324 |
3324 |
3325 lemma product_composition_lemma': |
3325 lemma product_composition_lemma': |
3326 assumes c0: "c$0 = (0::'a::idom)" |
3326 assumes c0: "c$0 = (0::'a::idom)" |
3327 and d0: "d$0 = 0" |
3327 and d0: "d$0 = 0" |
3328 shows "((a oo c) * (b oo d))$n = |
3328 shows "((a oo c) * (b oo d))$n = |
3329 setsum (\<lambda>k. setsum (\<lambda>m. a$k * b$m * (c^k * d^m) $ n) {0..n}) {0..n}" (is "?l = ?r") |
3329 sum (\<lambda>k. sum (\<lambda>m. a$k * b$m * (c^k * d^m) $ n) {0..n}) {0..n}" (is "?l = ?r") |
3330 unfolding product_composition_lemma[OF c0 d0] |
3330 unfolding product_composition_lemma[OF c0 d0] |
3331 unfolding setsum.cartesian_product |
3331 unfolding sum.cartesian_product |
3332 apply (rule setsum.mono_neutral_left) |
3332 apply (rule sum.mono_neutral_left) |
3333 apply simp |
3333 apply simp |
3334 apply (clarsimp simp add: subset_eq) |
3334 apply (clarsimp simp add: subset_eq) |
3335 apply clarsimp |
3335 apply clarsimp |
3336 apply (rule ccontr) |
3336 apply (rule ccontr) |
3337 apply (subgoal_tac "(c^aa * d^ba) $ n = 0") |
3337 apply (subgoal_tac "(c^aa * d^ba) $ n = 0") |
3338 apply simp |
3338 apply simp |
3339 unfolding fps_mult_nth |
3339 unfolding fps_mult_nth |
3340 apply (rule setsum.neutral) |
3340 apply (rule sum.neutral) |
3341 apply (clarsimp simp add: not_le) |
3341 apply (clarsimp simp add: not_le) |
3342 apply (case_tac "x < aa") |
3342 apply (case_tac "x < aa") |
3343 apply (rule startsby_zero_power_prefix[OF c0, rule_format]) |
3343 apply (rule startsby_zero_power_prefix[OF c0, rule_format]) |
3344 apply simp |
3344 apply simp |
3345 apply (subgoal_tac "n - x < ba") |
3345 apply (subgoal_tac "n - x < ba") |
3347 apply simp |
3347 apply simp |
3348 apply arith |
3348 apply arith |
3349 done |
3349 done |
3350 |
3350 |
3351 |
3351 |
3352 lemma setsum_pair_less_iff: |
3352 lemma sum_pair_less_iff: |
3353 "setsum (\<lambda>((k::nat),m). a k * b m * c (k + m)) {(k,m). k + m \<le> n} = |
3353 "sum (\<lambda>((k::nat),m). a k * b m * c (k + m)) {(k,m). k + m \<le> n} = |
3354 setsum (\<lambda>s. setsum (\<lambda>i. a i * b (s - i) * c s) {0..s}) {0..n}" |
3354 sum (\<lambda>s. sum (\<lambda>i. a i * b (s - i) * c s) {0..s}) {0..n}" |
3355 (is "?l = ?r") |
3355 (is "?l = ?r") |
3356 proof - |
3356 proof - |
3357 let ?KM = "{(k,m). k + m \<le> n}" |
3357 let ?KM = "{(k,m). k + m \<le> n}" |
3358 let ?f = "\<lambda>s. UNION {(0::nat)..s} (\<lambda>i. {(i,s - i)})" |
3358 let ?f = "\<lambda>s. UNION {(0::nat)..s} (\<lambda>i. {(i,s - i)})" |
3359 have th0: "?KM = UNION {0..n} ?f" |
3359 have th0: "?KM = UNION {0..n} ?f" |
3360 by auto |
3360 by auto |
3361 show "?l = ?r " |
3361 show "?l = ?r " |
3362 unfolding th0 |
3362 unfolding th0 |
3363 apply (subst setsum.UNION_disjoint) |
3363 apply (subst sum.UNION_disjoint) |
3364 apply auto |
3364 apply auto |
3365 apply (subst setsum.UNION_disjoint) |
3365 apply (subst sum.UNION_disjoint) |
3366 apply auto |
3366 apply auto |
3367 done |
3367 done |
3368 qed |
3368 qed |
3369 |
3369 |
3370 lemma fps_compose_mult_distrib_lemma: |
3370 lemma fps_compose_mult_distrib_lemma: |
3371 assumes c0: "c$0 = (0::'a::idom)" |
3371 assumes c0: "c$0 = (0::'a::idom)" |
3372 shows "((a oo c) * (b oo c))$n = setsum (\<lambda>s. setsum (\<lambda>i. a$i * b$(s - i) * (c^s) $ n) {0..s}) {0..n}" |
3372 shows "((a oo c) * (b oo c))$n = sum (\<lambda>s. sum (\<lambda>i. a$i * b$(s - i) * (c^s) $ n) {0..s}) {0..n}" |
3373 unfolding product_composition_lemma[OF c0 c0] power_add[symmetric] |
3373 unfolding product_composition_lemma[OF c0 c0] power_add[symmetric] |
3374 unfolding setsum_pair_less_iff[where a = "\<lambda>k. a$k" and b="\<lambda>m. b$m" and c="\<lambda>s. (c ^ s)$n" and n = n] .. |
3374 unfolding sum_pair_less_iff[where a = "\<lambda>k. a$k" and b="\<lambda>m. b$m" and c="\<lambda>s. (c ^ s)$n" and n = n] .. |
3375 |
3375 |
3376 lemma fps_compose_mult_distrib: |
3376 lemma fps_compose_mult_distrib: |
3377 assumes c0: "c $ 0 = (0::'a::idom)" |
3377 assumes c0: "c $ 0 = (0::'a::idom)" |
3378 shows "(a * b) oo c = (a oo c) * (b oo c)" |
3378 shows "(a * b) oo c = (a oo c) * (b oo c)" |
3379 apply (simp add: fps_eq_iff fps_compose_mult_distrib_lemma [OF c0]) |
3379 apply (simp add: fps_eq_iff fps_compose_mult_distrib_lemma [OF c0]) |
3380 apply (simp add: fps_compose_nth fps_mult_nth setsum_distrib_right) |
3380 apply (simp add: fps_compose_nth fps_mult_nth sum_distrib_right) |
3381 done |
3381 done |
3382 |
3382 |
3383 lemma fps_compose_setprod_distrib: |
3383 lemma fps_compose_setprod_distrib: |
3384 assumes c0: "c$0 = (0::'a::idom)" |
3384 assumes c0: "c$0 = (0::'a::idom)" |
3385 shows "setprod a S oo c = setprod (\<lambda>k. a k oo c) S" |
3385 shows "setprod a S oo c = setprod (\<lambda>k. a k oo c) S" |
3418 then show ?thesis |
3418 then show ?thesis |
3419 by (simp add: fps_compose_setprod_distrib[OF c0]) |
3419 by (simp add: fps_compose_setprod_distrib[OF c0]) |
3420 qed |
3420 qed |
3421 |
3421 |
3422 lemma fps_compose_uminus: "- (a::'a::ring_1 fps) oo c = - (a oo c)" |
3422 lemma fps_compose_uminus: "- (a::'a::ring_1 fps) oo c = - (a oo c)" |
3423 by (simp add: fps_eq_iff fps_compose_nth field_simps setsum_negf[symmetric]) |
3423 by (simp add: fps_eq_iff fps_compose_nth field_simps sum_negf[symmetric]) |
3424 |
3424 |
3425 lemma fps_compose_sub_distrib: "(a - b) oo (c::'a::ring_1 fps) = (a oo c) - (b oo c)" |
3425 lemma fps_compose_sub_distrib: "(a - b) oo (c::'a::ring_1 fps) = (a oo c) - (b oo c)" |
3426 using fps_compose_add_distrib [of a "- b" c] by (simp add: fps_compose_uminus) |
3426 using fps_compose_add_distrib [of a "- b" c] by (simp add: fps_compose_uminus) |
3427 |
3427 |
3428 lemma X_fps_compose: "X oo a = Abs_fps (\<lambda>n. if n = 0 then (0::'a::comm_ring_1) else a$n)" |
3428 lemma X_fps_compose: "X oo a = Abs_fps (\<lambda>n. if n = 0 then (0::'a::comm_ring_1) else a$n)" |
3429 by (simp add: fps_eq_iff fps_compose_nth mult_delta_left setsum.delta) |
3429 by (simp add: fps_eq_iff fps_compose_nth mult_delta_left sum.delta) |
3430 |
3430 |
3431 lemma fps_inverse_compose: |
3431 lemma fps_inverse_compose: |
3432 assumes b0: "(b$0 :: 'a::field) = 0" |
3432 assumes b0: "(b$0 :: 'a::field) = 0" |
3433 and a0: "a$0 \<noteq> 0" |
3433 and a0: "a$0 \<noteq> 0" |
3434 shows "inverse a oo b = inverse (a oo b)" |
3434 shows "inverse a oo b = inverse (a oo b)" |
3509 and b0: "b$0 = 0" |
3509 and b0: "b$0 = 0" |
3510 shows "a oo (b oo c) = a oo b oo c" (is "?l = ?r") |
3510 shows "a oo (b oo c) = a oo b oo c" (is "?l = ?r") |
3511 proof - |
3511 proof - |
3512 have "?l$n = ?r$n" for n |
3512 have "?l$n = ?r$n" for n |
3513 proof - |
3513 proof - |
3514 have "?l$n = (setsum (\<lambda>i. (fps_const (a$i) * b^i) oo c) {0..n})$n" |
3514 have "?l$n = (sum (\<lambda>i. (fps_const (a$i) * b^i) oo c) {0..n})$n" |
3515 by (simp add: fps_compose_nth fps_compose_power[OF c0] fps_const_mult_apply_left |
3515 by (simp add: fps_compose_nth fps_compose_power[OF c0] fps_const_mult_apply_left |
3516 setsum_distrib_left mult.assoc fps_setsum_nth) |
3516 sum_distrib_left mult.assoc fps_sum_nth) |
3517 also have "\<dots> = ((setsum (\<lambda>i. fps_const (a$i) * b^i) {0..n}) oo c)$n" |
3517 also have "\<dots> = ((sum (\<lambda>i. fps_const (a$i) * b^i) {0..n}) oo c)$n" |
3518 by (simp add: fps_compose_setsum_distrib) |
3518 by (simp add: fps_compose_sum_distrib) |
3519 also have "\<dots> = ?r$n" |
3519 also have "\<dots> = ?r$n" |
3520 apply (simp add: fps_compose_nth fps_setsum_nth setsum_distrib_right mult.assoc) |
3520 apply (simp add: fps_compose_nth fps_sum_nth sum_distrib_right mult.assoc) |
3521 apply (rule setsum.cong) |
3521 apply (rule sum.cong) |
3522 apply (rule refl) |
3522 apply (rule refl) |
3523 apply (rule setsum.mono_neutral_right) |
3523 apply (rule sum.mono_neutral_right) |
3524 apply (auto simp add: not_le) |
3524 apply (auto simp add: not_le) |
3525 apply (erule startsby_zero_power_prefix[OF b0, rule_format]) |
3525 apply (erule startsby_zero_power_prefix[OF b0, rule_format]) |
3526 done |
3526 done |
3527 finally show ?thesis . |
3527 finally show ?thesis . |
3528 qed |
3528 qed |
4064 gbinomial_minus binomial_gbinomial of_nat_diff) |
4064 gbinomial_minus binomial_gbinomial of_nat_diff) |
4065 done |
4065 done |
4066 |
4066 |
4067 text \<open>Vandermonde's Identity as a consequence.\<close> |
4067 text \<open>Vandermonde's Identity as a consequence.\<close> |
4068 lemma gbinomial_Vandermonde: |
4068 lemma gbinomial_Vandermonde: |
4069 "setsum (\<lambda>k. (a gchoose k) * (b gchoose (n - k))) {0..n} = (a + b) gchoose n" |
4069 "sum (\<lambda>k. (a gchoose k) * (b gchoose (n - k))) {0..n} = (a + b) gchoose n" |
4070 proof - |
4070 proof - |
4071 let ?ba = "fps_binomial a" |
4071 let ?ba = "fps_binomial a" |
4072 let ?bb = "fps_binomial b" |
4072 let ?bb = "fps_binomial b" |
4073 let ?bab = "fps_binomial (a + b)" |
4073 let ?bab = "fps_binomial (a + b)" |
4074 from fps_binomial_add_mult[of a b] have "?bab $ n = (?ba * ?bb)$n" by simp |
4074 from fps_binomial_add_mult[of a b] have "?bab $ n = (?ba * ?bb)$n" by simp |
4075 then show ?thesis by (simp add: fps_mult_nth) |
4075 then show ?thesis by (simp add: fps_mult_nth) |
4076 qed |
4076 qed |
4077 |
4077 |
4078 lemma binomial_Vandermonde: |
4078 lemma binomial_Vandermonde: |
4079 "setsum (\<lambda>k. (a choose k) * (b choose (n - k))) {0..n} = (a + b) choose n" |
4079 "sum (\<lambda>k. (a choose k) * (b choose (n - k))) {0..n} = (a + b) choose n" |
4080 using gbinomial_Vandermonde[of "(of_nat a)" "of_nat b" n] |
4080 using gbinomial_Vandermonde[of "(of_nat a)" "of_nat b" n] |
4081 by (simp only: binomial_gbinomial[symmetric] of_nat_mult[symmetric] |
4081 by (simp only: binomial_gbinomial[symmetric] of_nat_mult[symmetric] |
4082 of_nat_setsum[symmetric] of_nat_add[symmetric] of_nat_eq_iff) |
4082 of_nat_sum[symmetric] of_nat_add[symmetric] of_nat_eq_iff) |
4083 |
4083 |
4084 lemma binomial_Vandermonde_same: "setsum (\<lambda>k. (n choose k)\<^sup>2) {0..n} = (2 * n) choose n" |
4084 lemma binomial_Vandermonde_same: "sum (\<lambda>k. (n choose k)\<^sup>2) {0..n} = (2 * n) choose n" |
4085 using binomial_Vandermonde[of n n n, symmetric] |
4085 using binomial_Vandermonde[of n n n, symmetric] |
4086 unfolding mult_2 |
4086 unfolding mult_2 |
4087 apply (simp add: power2_eq_square) |
4087 apply (simp add: power2_eq_square) |
4088 apply (rule setsum.cong) |
4088 apply (rule sum.cong) |
4089 apply (auto intro: binomial_symmetric) |
4089 apply (auto intro: binomial_symmetric) |
4090 done |
4090 done |
4091 |
4091 |
4092 lemma Vandermonde_pochhammer_lemma: |
4092 lemma Vandermonde_pochhammer_lemma: |
4093 fixes a :: "'a::field_char_0" |
4093 fixes a :: "'a::field_char_0" |
4094 assumes b: "\<forall>j\<in>{0 ..<n}. b \<noteq> of_nat j" |
4094 assumes b: "\<forall>j\<in>{0 ..<n}. b \<noteq> of_nat j" |
4095 shows "setsum (\<lambda>k. (pochhammer (- a) k * pochhammer (- (of_nat n)) k) / |
4095 shows "sum (\<lambda>k. (pochhammer (- a) k * pochhammer (- (of_nat n)) k) / |
4096 (of_nat (fact k) * pochhammer (b - of_nat n + 1) k)) {0..n} = |
4096 (of_nat (fact k) * pochhammer (b - of_nat n + 1) k)) {0..n} = |
4097 pochhammer (- (a + b)) n / pochhammer (- b) n" |
4097 pochhammer (- (a + b)) n / pochhammer (- b) n" |
4098 (is "?l = ?r") |
4098 (is "?l = ?r") |
4099 proof - |
4099 proof - |
4100 let ?m1 = "\<lambda>m. (- 1 :: 'a) ^ m" |
4100 let ?m1 = "\<lambda>m. (- 1 :: 'a) ^ m" |
4222 also have "\<dots> = ?l" |
4222 also have "\<dots> = ?l" |
4223 unfolding gbinomial_Vandermonde[symmetric] |
4223 unfolding gbinomial_Vandermonde[symmetric] |
4224 apply (simp add: th00) |
4224 apply (simp add: th00) |
4225 unfolding gbinomial_pochhammer |
4225 unfolding gbinomial_pochhammer |
4226 using bn0 |
4226 using bn0 |
4227 apply (simp add: setsum_distrib_right setsum_distrib_left field_simps) |
4227 apply (simp add: sum_distrib_right sum_distrib_left field_simps) |
4228 done |
4228 done |
4229 finally show ?thesis by simp |
4229 finally show ?thesis by simp |
4230 qed |
4230 qed |
4231 |
4231 |
4232 lemma Vandermonde_pochhammer: |
4232 lemma Vandermonde_pochhammer: |
4233 fixes a :: "'a::field_char_0" |
4233 fixes a :: "'a::field_char_0" |
4234 assumes c: "\<forall>i \<in> {0..< n}. c \<noteq> - of_nat i" |
4234 assumes c: "\<forall>i \<in> {0..< n}. c \<noteq> - of_nat i" |
4235 shows "setsum (\<lambda>k. (pochhammer a k * pochhammer (- (of_nat n)) k) / |
4235 shows "sum (\<lambda>k. (pochhammer a k * pochhammer (- (of_nat n)) k) / |
4236 (of_nat (fact k) * pochhammer c k)) {0..n} = pochhammer (c - a) n / pochhammer c n" |
4236 (of_nat (fact k) * pochhammer c k)) {0..n} = pochhammer (c - a) n / pochhammer c n" |
4237 proof - |
4237 proof - |
4238 let ?a = "- a" |
4238 let ?a = "- a" |
4239 let ?b = "c + of_nat n - 1" |
4239 let ?b = "c + of_nat n - 1" |
4240 have h: "\<forall> j \<in>{0..< n}. ?b \<noteq> of_nat j" |
4240 have h: "\<forall> j \<in>{0..< n}. ?b \<noteq> of_nat j" |