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