src/HOL/Library/Formal_Power_Series.thy
changeset 64267 b9a1486e79be
parent 64242 93c6f0da5c70
child 64272 f76b6dda2e56
equal deleted inserted replaced
64265:8eb6365f5916 64267:b9a1486e79be
   127 lemma fps_mult_assoc_lemma:
   127 lemma fps_mult_assoc_lemma:
   128   fixes k :: nat
   128   fixes k :: nat
   129     and f :: "nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> 'a::comm_monoid_add"
   129     and f :: "nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> 'a::comm_monoid_add"
   130   shows "(\<Sum>j=0..k. \<Sum>i=0..j. f i (j - i) (n - j)) =
   130   shows "(\<Sum>j=0..k. \<Sum>i=0..j. f i (j - i) (n - j)) =
   131          (\<Sum>j=0..k. \<Sum>i=0..k - j. f j i (n - j - i))"
   131          (\<Sum>j=0..k. \<Sum>i=0..k - j. f j i (n - j - i))"
   132   by (induct k) (simp_all add: Suc_diff_le setsum.distrib add.assoc)
   132   by (induct k) (simp_all add: Suc_diff_le sum.distrib add.assoc)
   133 
   133 
   134 instance fps :: (semiring_0) semigroup_mult
   134 instance fps :: (semiring_0) semigroup_mult
   135 proof
   135 proof
   136   fix a b c :: "'a fps"
   136   fix a b c :: "'a fps"
   137   show "(a * b) * c = a * (b * c)"
   137   show "(a * b) * c = a * (b * c)"
   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"
   179 
   179 
   180 instance fps :: (semiring_1) monoid_mult
   180 instance fps :: (semiring_1) monoid_mult
   181 proof
   181 proof
   182   fix a :: "'a fps"
   182   fix a :: "'a fps"
   183   show "1 * a = a"
   183   show "1 * a = a"
   184     by (simp add: fps_ext fps_mult_nth mult_delta_left setsum.delta)
   184     by (simp add: fps_ext fps_mult_nth mult_delta_left sum.delta)
   185   show "a * 1 = a"
   185   show "a * 1 = a"
   186     by (simp add: fps_ext fps_mult_nth mult_delta_right setsum.delta')
   186     by (simp add: fps_ext fps_mult_nth mult_delta_right sum.delta')
   187 qed
   187 qed
   188 
   188 
   189 instance fps :: (cancel_semigroup_add) cancel_semigroup_add
   189 instance fps :: (cancel_semigroup_add) cancel_semigroup_add
   190 proof
   190 proof
   191   fix a b c :: "'a fps"
   191   fix a b c :: "'a fps"
   225 
   225 
   226 instance fps :: (semiring_0) semiring
   226 instance fps :: (semiring_0) semiring
   227 proof
   227 proof
   228   fix a b c :: "'a fps"
   228   fix a b c :: "'a fps"
   229   show "(a + b) * c = a * c + b * c"
   229   show "(a + b) * c = a * c + b * c"
   230     by (simp add: expand_fps_eq fps_mult_nth distrib_right setsum.distrib)
   230     by (simp add: expand_fps_eq fps_mult_nth distrib_right sum.distrib)
   231   show "a * (b + c) = a * b + a * c"
   231   show "a * (b + c) = a * b + a * c"
   232     by (simp add: expand_fps_eq fps_mult_nth distrib_left setsum.distrib)
   232     by (simp add: expand_fps_eq fps_mult_nth distrib_left sum.distrib)
   233 qed
   233 qed
   234 
   234 
   235 instance fps :: (semiring_0) semiring_0
   235 instance fps :: (semiring_0) semiring_0
   236 proof
   236 proof
   237   fix a :: "'a fps"
   237   fix a :: "'a fps"
   274 qed
   274 qed
   275 
   275 
   276 lemma fps_eq_iff: "f = g \<longleftrightarrow> (\<forall>n. f $ n = g $n)"
   276 lemma fps_eq_iff: "f = g \<longleftrightarrow> (\<forall>n. f $ n = g $n)"
   277   by (rule expand_fps_eq)
   277   by (rule expand_fps_eq)
   278 
   278 
   279 lemma fps_setsum_nth: "setsum f S $ n = setsum (\<lambda>k. (f k) $ n) S"
   279 lemma fps_sum_nth: "sum f S $ n = sum (\<lambda>k. (f k) $ n) S"
   280 proof (cases "finite S")
   280 proof (cases "finite S")
   281   case True
   281   case True
   282   then show ?thesis by (induct set: finite) auto
   282   then show ?thesis by (induct set: finite) auto
   283 next
   283 next
   284   case False
   284   case False
   307 
   307 
   308 lemma fps_const_sub [simp]: "fps_const (c::'a::group_add) - fps_const d = fps_const (c - d)"
   308 lemma fps_const_sub [simp]: "fps_const (c::'a::group_add) - fps_const d = fps_const (c - d)"
   309   by (simp add: fps_ext)
   309   by (simp add: fps_ext)
   310 
   310 
   311 lemma fps_const_mult[simp]: "fps_const (c::'a::ring) * fps_const d = fps_const (c * d)"
   311 lemma fps_const_mult[simp]: "fps_const (c::'a::ring) * fps_const d = fps_const (c * d)"
   312   by (simp add: fps_eq_iff fps_mult_nth setsum.neutral)
   312   by (simp add: fps_eq_iff fps_mult_nth sum.neutral)
   313 
   313 
   314 lemma fps_const_add_left: "fps_const (c::'a::monoid_add) + f =
   314 lemma fps_const_add_left: "fps_const (c::'a::monoid_add) + f =
   315     Abs_fps (\<lambda>n. if n = 0 then c + f$0 else f$n)"
   315     Abs_fps (\<lambda>n. if n = 0 then c + f$0 else f$n)"
   316   by (simp add: fps_ext)
   316   by (simp add: fps_ext)
   317 
   317 
   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
   407 proof (cases "n = 0")
   407 proof (cases "n = 0")
   408   case False
   408   case False
   409   have "(X * f) $n = (\<Sum>i = 0..n. X $ i * f $ (n - i))"
   409   have "(X * f) $n = (\<Sum>i = 0..n. X $ i * f $ (n - i))"
   410     by (simp add: fps_mult_nth)
   410     by (simp add: fps_mult_nth)
   411   also have "\<dots> = f $ (n - 1)"
   411   also have "\<dots> = f $ (n - 1)"
   412     using False by (simp add: X_def mult_delta_left setsum.delta)
   412     using False by (simp add: X_def mult_delta_left sum.delta)
   413   finally show ?thesis
   413   finally show ?thesis
   414     using False by simp
   414     using False by simp
   415 next
   415 next
   416   case True
   416   case True
   417   then show ?thesis
   417   then show ?thesis
   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
  1098     by auto
  1098     by auto
  1099   have f: "finite {0.. n - 1}" "finite {n}"
  1099   have f: "finite {0.. n - 1}" "finite {n}"
  1100     by auto
  1100     by auto
  1101   show ?thesis
  1101   show ?thesis
  1102     unfolding th1
  1102     unfolding th1
  1103     apply (simp add: setsum.union_disjoint[OF f d, unfolded eq[symmetric]] del: One_nat_def)
  1103     apply (simp add: sum.union_disjoint[OF f d, unfolded eq[symmetric]] del: One_nat_def)
  1104     unfolding th2
  1104     unfolding th2
  1105     apply (simp add: setsum.delta)
  1105     apply (simp add: sum.delta)
  1106     done
  1106     done
  1107 qed
  1107 qed
  1108 
  1108 
  1109 lemma fps_inverse_mult: "inverse (f * g :: 'a::field fps) = inverse f * inverse g"
  1109 lemma fps_inverse_mult: "inverse (f * g :: 'a::field fps) = inverse f * inverse g"
  1110 proof (cases "f$0 = 0 \<or> g$0 = 0")
  1110 proof (cases "f$0 = 0 \<or> g$0 = 0")
  1125 
  1125 
  1126 
  1126 
  1127 lemma fps_inverse_gp: "inverse (Abs_fps(\<lambda>n. (1::'a::field))) =
  1127 lemma fps_inverse_gp: "inverse (Abs_fps(\<lambda>n. (1::'a::field))) =
  1128     Abs_fps (\<lambda>n. if n= 0 then 1 else if n=1 then - 1 else 0)"
  1128     Abs_fps (\<lambda>n. if n= 0 then 1 else if n=1 then - 1 else 0)"
  1129   apply (rule fps_inverse_unique)
  1129   apply (rule fps_inverse_unique)
  1130   apply (simp_all add: fps_eq_iff fps_mult_nth setsum_zero_lemma)
  1130   apply (simp_all add: fps_eq_iff fps_mult_nth sum_zero_lemma)
  1131   done
  1131   done
  1132 
  1132 
  1133 lemma subdegree_inverse [simp]: "subdegree (inverse (f::'a::field fps)) = 0"
  1133 lemma subdegree_inverse [simp]: "subdegree (inverse (f::'a::field fps)) = 0"
  1134 proof (cases "f$0 = 0")
  1134 proof (cases "f$0 = 0")
  1135   assume nz: "f$0 \<noteq> 0"
  1135   assume nz: "f$0 \<noteq> 0"
  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
  1602 
  1602 
  1603 lemma fps_deriv_mult_const_right[simp]:
  1603 lemma fps_deriv_mult_const_right[simp]:
  1604   "fps_deriv (f * fps_const (c::'a::comm_ring_1)) = fps_deriv f * fps_const c"
  1604   "fps_deriv (f * fps_const (c::'a::comm_ring_1)) = fps_deriv f * fps_const c"
  1605   by simp
  1605   by simp
  1606 
  1606 
  1607 lemma fps_deriv_setsum:
  1607 lemma fps_deriv_sum:
  1608   "fps_deriv (setsum f S) = setsum (\<lambda>i. fps_deriv (f i :: 'a::comm_ring_1 fps)) S"
  1608   "fps_deriv (sum f S) = sum (\<lambda>i. fps_deriv (f i :: 'a::comm_ring_1 fps)) S"
  1609 proof (cases "finite S")
  1609 proof (cases "finite S")
  1610   case False
  1610   case False
  1611   then show ?thesis by simp
  1611   then show ?thesis by simp
  1612 next
  1612 next
  1613   case True
  1613   case True
  1697 
  1697 
  1698 lemma fps_nth_deriv_mult_const_right[simp]:
  1698 lemma fps_nth_deriv_mult_const_right[simp]:
  1699   "fps_nth_deriv n (f * fps_const (c::'a::comm_ring_1)) = fps_nth_deriv n f * fps_const c"
  1699   "fps_nth_deriv n (f * fps_const (c::'a::comm_ring_1)) = fps_nth_deriv n f * fps_const c"
  1700   using fps_nth_deriv_linear[of n "c" f 0 0] by (simp add: mult.commute)
  1700   using fps_nth_deriv_linear[of n "c" f 0 0] by (simp add: mult.commute)
  1701 
  1701 
  1702 lemma fps_nth_deriv_setsum:
  1702 lemma fps_nth_deriv_sum:
  1703   "fps_nth_deriv n (setsum f S) = setsum (\<lambda>i. fps_nth_deriv n (f i :: 'a::comm_ring_1 fps)) S"
  1703   "fps_nth_deriv n (sum f S) = sum (\<lambda>i. fps_nth_deriv n (f i :: 'a::comm_ring_1 fps)) S"
  1704 proof (cases "finite S")
  1704 proof (cases "finite S")
  1705   case True
  1705   case True
  1706   show ?thesis by (induct rule: finite_induct [OF True]) simp_all
  1706   show ?thesis by (induct rule: finite_induct [OF True]) simp_all
  1707 next
  1707 next
  1708   case False
  1708   case False
  1769       have "a ^k $ m = (a^l * a) $m"
  1769       have "a ^k $ m = (a^l * a) $m"
  1770         by (simp add: Suc mult.commute)
  1770         by (simp add: Suc mult.commute)
  1771       also have "\<dots> = (\<Sum>i = 0..m. a ^ l $ i * a $ (m - i))"
  1771       also have "\<dots> = (\<Sum>i = 0..m. a ^ l $ i * a $ (m - i))"
  1772         by (simp add: fps_mult_nth)
  1772         by (simp add: fps_mult_nth)
  1773       also have "\<dots> = 0"
  1773       also have "\<dots> = 0"
  1774         apply (rule setsum.neutral)
  1774         apply (rule sum.neutral)
  1775         apply auto
  1775         apply auto
  1776         apply (case_tac "x = m")
  1776         apply (case_tac "x = m")
  1777         using a0 apply simp
  1777         using a0 apply simp
  1778         apply (rule H[rule_format])
  1778         apply (rule H[rule_format])
  1779         using a0 Suc mk apply auto
  1779         using a0 Suc mk apply auto
  1782     qed
  1782     qed
  1783     then show ?thesis by blast
  1783     then show ?thesis by blast
  1784   qed
  1784   qed
  1785 qed
  1785 qed
  1786 
  1786 
  1787 lemma startsby_zero_setsum_depends:
  1787 lemma startsby_zero_sum_depends:
  1788   assumes a0: "a $0 = (0::'a::idom)"
  1788   assumes a0: "a $0 = (0::'a::idom)"
  1789     and kn: "n \<ge> k"
  1789     and kn: "n \<ge> k"
  1790   shows "setsum (\<lambda>i. (a ^ i)$k) {0 .. n} = setsum (\<lambda>i. (a ^ i)$k) {0 .. k}"
  1790   shows "sum (\<lambda>i. (a ^ i)$k) {0 .. n} = sum (\<lambda>i. (a ^ i)$k) {0 .. k}"
  1791   apply (rule setsum.mono_neutral_right)
  1791   apply (rule sum.mono_neutral_right)
  1792   using kn
  1792   using kn
  1793   apply auto
  1793   apply auto
  1794   apply (rule startsby_zero_power_prefix[rule_format, OF a0])
  1794   apply (rule startsby_zero_power_prefix[rule_format, OF a0])
  1795   apply arith
  1795   apply arith
  1796   done
  1796   done
  1803   then show ?case by simp
  1803   then show ?case by simp
  1804 next
  1804 next
  1805   case (Suc n)
  1805   case (Suc n)
  1806   have "a ^ Suc n $ (Suc n) = (a^n * a)$(Suc n)"
  1806   have "a ^ Suc n $ (Suc n) = (a^n * a)$(Suc n)"
  1807     by (simp add: field_simps)
  1807     by (simp add: field_simps)
  1808   also have "\<dots> = setsum (\<lambda>i. a^n$i * a $ (Suc n - i)) {0.. Suc n}"
  1808   also have "\<dots> = sum (\<lambda>i. a^n$i * a $ (Suc n - i)) {0.. Suc n}"
  1809     by (simp add: fps_mult_nth)
  1809     by (simp add: fps_mult_nth)
  1810   also have "\<dots> = setsum (\<lambda>i. a^n$i * a $ (Suc n - i)) {n .. Suc n}"
  1810   also have "\<dots> = sum (\<lambda>i. a^n$i * a $ (Suc n - i)) {n .. Suc n}"
  1811     apply (rule setsum.mono_neutral_right)
  1811     apply (rule sum.mono_neutral_right)
  1812     apply simp
  1812     apply simp
  1813     apply clarsimp
  1813     apply clarsimp
  1814     apply clarsimp
  1814     apply clarsimp
  1815     apply (rule startsby_zero_power_prefix[rule_format, OF a0])
  1815     apply (rule startsby_zero_power_prefix[rule_format, OF a0])
  1816     apply arith
  1816     apply arith
  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)"
  2049 text \<open>Rule 3 is trivial and is given by \<open>fps_times_def\<close>.\<close>
  2049 text \<open>Rule 3 is trivial and is given by \<open>fps_times_def\<close>.\<close>
  2050 
  2050 
  2051 
  2051 
  2052 subsubsection \<open>Rule 5 --- summation and "division" by (1 - X)\<close>
  2052 subsubsection \<open>Rule 5 --- summation and "division" by (1 - X)\<close>
  2053 
  2053 
  2054 lemma fps_divide_X_minus1_setsum_lemma:
  2054 lemma fps_divide_X_minus1_sum_lemma:
  2055   "a = ((1::'a::comm_ring_1 fps) - X) * Abs_fps (\<lambda>n. setsum (\<lambda>i. a $ i) {0..n})"
  2055   "a = ((1::'a::comm_ring_1 fps) - X) * Abs_fps (\<lambda>n. sum (\<lambda>i. a $ i) {0..n})"
  2056 proof -
  2056 proof -
  2057   let ?sa = "Abs_fps (\<lambda>n. setsum (\<lambda>i. a $ i) {0..n})"
  2057   let ?sa = "Abs_fps (\<lambda>n. sum (\<lambda>i. a $ i) {0..n})"
  2058   have th0: "\<And>i. (1 - (X::'a fps)) $ i = (if i = 0 then 1 else if i = 1 then - 1 else 0)"
  2058   have th0: "\<And>i. (1 - (X::'a fps)) $ i = (if i = 0 then 1 else if i = 1 then - 1 else 0)"
  2059     by simp
  2059     by simp
  2060   have "a$n = ((1 - X) * ?sa) $ n" for n
  2060   have "a$n = ((1 - X) * ?sa) $ n" for n
  2061   proof (cases "n = 0")
  2061   proof (cases "n = 0")
  2062     case True
  2062     case True
  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
  2280 text \<open>The general form.\<close>
  2280 text \<open>The general form.\<close>
  2281 lemma fps_setprod_nth:
  2281 lemma fps_setprod_nth:
  2282   fixes m :: nat
  2282   fixes m :: nat
  2283     and a :: "nat \<Rightarrow> 'a::comm_ring_1 fps"
  2283     and a :: "nat \<Rightarrow> 'a::comm_ring_1 fps"
  2284   shows "(setprod a {0 .. m}) $ n =
  2284   shows "(setprod a {0 .. m}) $ n =
  2285     setsum (\<lambda>v. setprod (\<lambda>j. (a j) $ (v!j)) {0..m}) (natpermute n (m+1))"
  2285     sum (\<lambda>v. setprod (\<lambda>j. (a j) $ (v!j)) {0..m}) (natpermute n (m+1))"
  2286   (is "?P m n")
  2286   (is "?P m n")
  2287 proof (induct m arbitrary: n rule: nat_less_induct)
  2287 proof (induct m arbitrary: n rule: nat_less_induct)
  2288   fix m n assume H: "\<forall>m' < m. \<forall>n. ?P m' n"
  2288   fix m n assume H: "\<forall>m' < m. \<forall>n. ?P m' n"
  2289   show "?P m n"
  2289   show "?P m n"
  2290   proof (cases m)
  2290   proof (cases m)
  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
  2573 where
  2573 where
  2574   "radical r 0 a 0 = 1"
  2574   "radical r 0 a 0 = 1"
  2575 | "radical r 0 a (Suc n) = 0"
  2575 | "radical r 0 a (Suc n) = 0"
  2576 | "radical r (Suc k) a 0 = r (Suc k) (a$0)"
  2576 | "radical r (Suc k) a 0 = r (Suc k) (a$0)"
  2577 | "radical r (Suc k) a (Suc n) =
  2577 | "radical r (Suc k) a (Suc n) =
  2578     (a$ Suc n - setsum (\<lambda>xs. setprod (\<lambda>j. radical r (Suc k) a (xs ! j)) {0..k})
  2578     (a$ Suc n - sum (\<lambda>xs. setprod (\<lambda>j. radical r (Suc k) a (xs ! j)) {0..k})
  2579       {xs. xs \<in> natpermute (Suc n) (Suc k) \<and> Suc n \<notin> set xs}) /
  2579       {xs. xs \<in> natpermute (Suc n) (Suc k) \<and> Suc n \<notin> set xs}) /
  2580     (of_nat (Suc k) * (radical r (Suc k) a 0)^k)"
  2580     (of_nat (Suc k) * (radical r (Suc k) a 0)^k)"
  2581   by pat_completeness auto
  2581   by pat_completeness auto
  2582 
  2582 
  2583 termination radical
  2583 termination radical
  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 
  3161 
  3161 
  3162 fun compinv :: "'a fps \<Rightarrow> nat \<Rightarrow> 'a::field"
  3162 fun compinv :: "'a fps \<Rightarrow> nat \<Rightarrow> 'a::field"
  3163 where
  3163 where
  3164   "compinv a 0 = X$0"
  3164   "compinv a 0 = X$0"
  3165 | "compinv a (Suc n) =
  3165 | "compinv a (Suc n) =
  3166     (X$ Suc n - setsum (\<lambda>i. (compinv a i) * (a^i)$Suc n) {0 .. n}) / (a$1) ^ Suc n"
  3166     (X$ Suc n - sum (\<lambda>i. (compinv a i) * (a^i)$Suc n) {0 .. n}) / (a$1) ^ Suc n"
  3167 
  3167 
  3168 definition "fps_inv a = Abs_fps (compinv a)"
  3168 definition "fps_inv a = Abs_fps (compinv a)"
  3169 
  3169 
  3170 lemma fps_inv:
  3170 lemma fps_inv:
  3171   assumes a0: "a$0 = 0"
  3171   assumes a0: "a$0 = 0"
  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
  3200 
  3200 
  3201 fun gcompinv :: "'a fps \<Rightarrow> 'a fps \<Rightarrow> nat \<Rightarrow> 'a::field"
  3201 fun gcompinv :: "'a fps \<Rightarrow> 'a fps \<Rightarrow> nat \<Rightarrow> 'a::field"
  3202 where
  3202 where
  3203   "gcompinv b a 0 = b$0"
  3203   "gcompinv b a 0 = b$0"
  3204 | "gcompinv b a (Suc n) =
  3204 | "gcompinv b a (Suc n) =
  3205     (b$ Suc n - setsum (\<lambda>i. (gcompinv b a i) * (a^i)$Suc n) {0 .. n}) / (a$1) ^ Suc n"
  3205     (b$ Suc n - sum (\<lambda>i. (gcompinv b a i) * (a^i)$Suc n) {0 .. n}) / (a$1) ^ Suc n"
  3206 
  3206 
  3207 definition "fps_ginv b a = Abs_fps (gcompinv b a)"
  3207 definition "fps_ginv b a = Abs_fps (gcompinv b a)"
  3208 
  3208 
  3209 lemma fps_ginv:
  3209 lemma fps_ginv:
  3210   assumes a0: "a$0 = 0"
  3210   assumes a0: "a$0 = 0"
  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)"
  3496   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]
  3496   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]
  3497   show ?thesis  .
  3497   show ?thesis  .
  3498 qed
  3498 qed
  3499 
  3499 
  3500 lemma fps_const_mult_apply_left: "fps_const c * (a oo b) = (fps_const c * a) oo b"
  3500 lemma fps_const_mult_apply_left: "fps_const c * (a oo b) = (fps_const c * a) oo b"
  3501   by (simp add: fps_eq_iff fps_compose_nth setsum_distrib_left mult.assoc)
  3501   by (simp add: fps_eq_iff fps_compose_nth sum_distrib_left mult.assoc)
  3502 
  3502 
  3503 lemma fps_const_mult_apply_right:
  3503 lemma fps_const_mult_apply_right:
  3504   "(a oo b) * fps_const (c::'a::comm_semiring_1) = (fps_const c * a) oo b"
  3504   "(a oo b) * fps_const (c::'a::comm_semiring_1) = (fps_const c * a) oo b"
  3505   by (auto simp add: fps_const_mult_apply_left mult.commute)
  3505   by (auto simp add: fps_const_mult_apply_left mult.commute)
  3506 
  3506 
  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
  3550         using a0 startsby_zero_power_prefix[OF a0] Suc
  3550         using a0 startsby_zero_power_prefix[OF a0] Suc
  3551         by (simp add: fps_compose_nth del: power_Suc)
  3551         by (simp add: fps_compose_nth del: power_Suc)
  3552     next
  3552     next
  3553       case 2
  3553       case 2
  3554       then show ?thesis
  3554       then show ?thesis
  3555         by (simp add: fps_compose_nth mult_delta_left setsum.delta)
  3555         by (simp add: fps_compose_nth mult_delta_left sum.delta)
  3556     qed
  3556     qed
  3557   qed
  3557   qed
  3558   then show ?thesis
  3558   then show ?thesis
  3559     unfolding fps_eq_iff by blast
  3559     unfolding fps_eq_iff by blast
  3560 qed
  3560 qed
  3686 qed
  3686 qed
  3687 
  3687 
  3688 lemma fps_compose_linear:
  3688 lemma fps_compose_linear:
  3689   "fps_compose (f :: 'a :: comm_ring_1 fps) (fps_const c * X) = Abs_fps (\<lambda>n. c^n * f $ n)"
  3689   "fps_compose (f :: 'a :: comm_ring_1 fps) (fps_const c * X) = Abs_fps (\<lambda>n. c^n * f $ n)"
  3690   by (simp add: fps_eq_iff fps_compose_def power_mult_distrib
  3690   by (simp add: fps_eq_iff fps_compose_def power_mult_distrib
  3691                 if_distrib setsum.delta' cong: if_cong)
  3691                 if_distrib sum.delta' cong: if_cong)
  3692 
  3692 
  3693 subsection \<open>Elementary series\<close>
  3693 subsection \<open>Elementary series\<close>
  3694 
  3694 
  3695 subsubsection \<open>Exponential series\<close>
  3695 subsubsection \<open>Exponential series\<close>
  3696 
  3696 
  3794     by auto
  3794     by auto
  3795 qed
  3795 qed
  3796 
  3796 
  3797 lemma Ec_E1_eq: "E (1::'a::field_char_0) oo (fps_const c * X) = E c"
  3797 lemma Ec_E1_eq: "E (1::'a::field_char_0) oo (fps_const c * X) = E c"
  3798   apply (auto simp add: fps_eq_iff E_def fps_compose_def power_mult_distrib)
  3798   apply (auto simp add: fps_eq_iff E_def fps_compose_def power_mult_distrib)
  3799   apply (simp add: cond_value_iff cond_application_beta setsum.delta' cong del: if_weak_cong)
  3799   apply (simp add: cond_value_iff cond_application_beta sum.delta' cong del: if_weak_cong)
  3800   done
  3800   done
  3801 
  3801 
  3802 
  3802 
  3803 subsubsection \<open>Logarithmic series\<close>
  3803 subsubsection \<open>Logarithmic series\<close>
  3804 
  3804 
  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"
  4251     by simp
  4251     by simp
  4252   have nz: "pochhammer c n \<noteq> 0" using c
  4252   have nz: "pochhammer c n \<noteq> 0" using c
  4253     by (simp add: pochhammer_eq_0_iff)
  4253     by (simp add: pochhammer_eq_0_iff)
  4254   from Vandermonde_pochhammer_lemma[where a = "?a" and b="?b" and n=n, OF h, unfolded th0 th1]
  4254   from Vandermonde_pochhammer_lemma[where a = "?a" and b="?b" and n=n, OF h, unfolded th0 th1]
  4255   show ?thesis
  4255   show ?thesis
  4256     using nz by (simp add: field_simps setsum_distrib_left)
  4256     using nz by (simp add: field_simps sum_distrib_left)
  4257 qed
  4257 qed
  4258 
  4258 
  4259 
  4259 
  4260 subsubsection \<open>Formal trigonometric functions\<close>
  4260 subsubsection \<open>Formal trigonometric functions\<close>
  4261 
  4261 
  4556 proof -
  4556 proof -
  4557   let ?a = "(Abs_fps (\<lambda>n. 1)) oo (fps_const c * X)"
  4557   let ?a = "(Abs_fps (\<lambda>n. 1)) oo (fps_const c * X)"
  4558   have th0: "(fps_const c * X) $ 0 = 0" by simp
  4558   have th0: "(fps_const c * X) $ 0 = 0" by simp
  4559   show ?thesis unfolding gp[OF th0, symmetric]
  4559   show ?thesis unfolding gp[OF th0, symmetric]
  4560     by (auto simp add: fps_eq_iff pochhammer_fact[symmetric]
  4560     by (auto simp add: fps_eq_iff pochhammer_fact[symmetric]
  4561       fps_compose_nth power_mult_distrib cond_value_iff setsum.delta' cong del: if_weak_cong)
  4561       fps_compose_nth power_mult_distrib cond_value_iff sum.delta' cong del: if_weak_cong)
  4562 qed
  4562 qed
  4563 
  4563 
  4564 lemma F_B[simp]: "F [-a] [] (- 1) = fps_binomial a"
  4564 lemma F_B[simp]: "F [-a] [] (- 1) = fps_binomial a"
  4565   by (simp add: fps_eq_iff gbinomial_pochhammer algebra_simps)
  4565   by (simp add: fps_eq_iff gbinomial_pochhammer algebra_simps)
  4566 
  4566 
  4618     (if k \<le> m then
  4618     (if k \<le> m then
  4619       pochhammer (- of_nat m) k * c ^ k / (pochhammer (- of_nat (m + n)) k * of_nat (fact k))
  4619       pochhammer (- of_nat m) k * c ^ k / (pochhammer (- of_nat (m + n)) k * of_nat (fact k))
  4620      else 0)"
  4620      else 0)"
  4621   by (auto simp add: pochhammer_eq_0_iff)
  4621   by (auto simp add: pochhammer_eq_0_iff)
  4622 
  4622 
  4623 lemma setsum_eq_if: "setsum f {(n::nat) .. m} = (if m < n then 0 else f n + setsum f {n+1 .. m})"
  4623 lemma sum_eq_if: "sum f {(n::nat) .. m} = (if m < n then 0 else f n + sum f {n+1 .. m})"
  4624   apply simp
  4624   apply simp
  4625   apply (subst setsum.insert[symmetric])
  4625   apply (subst sum.insert[symmetric])
  4626   apply (auto simp add: not_less setsum_head_Suc)
  4626   apply (auto simp add: not_less sum_head_Suc)
  4627   done
  4627   done
  4628 
  4628 
  4629 lemma pochhammer_rec_if: "pochhammer a n = (if n = 0 then 1 else a * pochhammer (a + 1) (n - 1))"
  4629 lemma pochhammer_rec_if: "pochhammer a n = (if n = 0 then 1 else a * pochhammer (a + 1) (n - 1))"
  4630   by (cases n) (simp_all add: pochhammer_rec)
  4630   by (cases n) (simp_all add: pochhammer_rec)
  4631 
  4631