src/HOL/Library/Formal_Power_Series.thy
changeset 31073 4b44c4d08aa6
parent 31021 53642251a04f
child 31075 a9d6cf6de9a8
equal deleted inserted replaced
31059:45c085c7efc6 31073:4b44c4d08aa6
  1438   show "card (\<Union>i\<in>{0..k}. {replicate (k + 1) 0[i := n]}) = k+1" by simp
  1438   show "card (\<Union>i\<in>{0..k}. {replicate (k + 1) 0[i := n]}) = k+1" by simp
  1439 qed
  1439 qed
  1440 
  1440 
  1441 lemma power_radical:
  1441 lemma power_radical:
  1442   fixes a:: "'a ::{field, ring_char_0} fps"
  1442   fixes a:: "'a ::{field, ring_char_0} fps"
       
  1443   assumes a0: "a$0 \<noteq> 0"
       
  1444   shows "(r (Suc k) (a$0)) ^ Suc k = a$0 \<longleftrightarrow> (fps_radical r (Suc k) a) ^ (Suc k) = a"
       
  1445 proof-
       
  1446   let ?r = "fps_radical r (Suc k) a"
       
  1447   {assume r0: "(r (Suc k) (a$0)) ^ Suc k = a$0"
       
  1448     from a0 r0 have r00: "r (Suc k) (a$0) \<noteq> 0" by auto
       
  1449     {fix z have "?r ^ Suc k $ z = a$z"
       
  1450       proof(induct z rule: nat_less_induct)
       
  1451 	fix n assume H: "\<forall>m<n. ?r ^ Suc k $ m = a$m"
       
  1452 	{assume "n = 0" hence "?r ^ Suc k $ n = a $n"
       
  1453 	    using fps_radical_power_nth[of r "Suc k" a, OF r0] by simp}
       
  1454 	moreover
       
  1455 	{fix n1 assume n1: "n = Suc n1"
       
  1456 	  have fK: "finite {0..k}" by simp
       
  1457 	  have nz: "n \<noteq> 0" using n1 by arith
       
  1458 	  let ?Pnk = "natpermute n (k + 1)"
       
  1459 	  let ?Pnkn = "{xs \<in> ?Pnk. n \<in> set xs}"
       
  1460 	  let ?Pnknn = "{xs \<in> ?Pnk. n \<notin> set xs}"
       
  1461 	  have eq: "?Pnkn \<union> ?Pnknn = ?Pnk" by blast
       
  1462 	  have d: "?Pnkn \<inter> ?Pnknn = {}" by blast
       
  1463 	  have f: "finite ?Pnkn" "finite ?Pnknn"
       
  1464 	    using finite_Un[of ?Pnkn ?Pnknn, unfolded eq]
       
  1465 	    by (metis natpermute_finite)+
       
  1466 	  let ?f = "\<lambda>v. \<Prod>j\<in>{0..k}. ?r $ v ! j"
       
  1467 	  have "setsum ?f ?Pnkn = setsum (\<lambda>v. ?r $ n * r (Suc k) (a $ 0) ^ k) ?Pnkn"
       
  1468 	  proof(rule setsum_cong2)
       
  1469 	    fix v assume v: "v \<in> {xs \<in> natpermute n (k + 1). n \<in> set xs}"
       
  1470 	    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"
       
  1471 	  from v obtain i where i: "i \<in> {0..k}" "v = replicate (k+1) 0 [i:= n]"
       
  1472 	    unfolding natpermute_contain_maximal by auto
       
  1473 	  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))"
       
  1474 	    apply (rule setprod_cong, simp)
       
  1475 	    using i r0 by (simp del: replicate.simps)
       
  1476 	  also have "\<dots> = (fps_radical r (Suc k) a $ n) * r (Suc k) (a$0) ^ k"
       
  1477 	    unfolding setprod_gen_delta[OF fK] using i r0 by simp
       
  1478 	  finally show ?ths .
       
  1479 	qed
       
  1480 	then have "setsum ?f ?Pnkn = of_nat (k+1) * ?r $ n * r (Suc k) (a $ 0) ^ k"
       
  1481 	  by (simp add: natpermute_max_card[OF nz, simplified])
       
  1482 	also have "\<dots> = a$n - setsum ?f ?Pnknn"
       
  1483 	  unfolding n1 using r00 a0 by (simp add: field_simps fps_radical_def del: of_nat_Suc )
       
  1484 	finally have fn: "setsum ?f ?Pnkn = a$n - setsum ?f ?Pnknn" .
       
  1485 	have "(?r ^ Suc k)$n = setsum ?f ?Pnkn + setsum ?f ?Pnknn"
       
  1486 	  unfolding fps_power_nth_Suc setsum_Un_disjoint[OF f d, unfolded eq] ..
       
  1487 	also have "\<dots> = a$n" unfolding fn by simp
       
  1488 	finally have "?r ^ Suc k $ n = a $n" .}
       
  1489       ultimately  show "?r ^ Suc k $ n = a $n" by (cases n, auto)
       
  1490     qed }
       
  1491   then have ?thesis using r0 by (simp add: fps_eq_iff)}
       
  1492 moreover 
       
  1493 { assume h: "(fps_radical r (Suc k) a) ^ (Suc k) = a"
       
  1494   hence "((fps_radical r (Suc k) a) ^ (Suc k))$0 = a$0" by simp
       
  1495   then have "(r (Suc k) (a$0)) ^ Suc k = a$0"
       
  1496     unfolding fps_power_nth_Suc
       
  1497     by (simp add: setprod_constant del: replicate.simps)}
       
  1498 ultimately show ?thesis by blast
       
  1499 qed
       
  1500 
       
  1501 (*
       
  1502 lemma power_radical:
       
  1503   fixes a:: "'a ::{field, ring_char_0} fps"
  1443   assumes r0: "(r (Suc k) (a$0)) ^ Suc k = a$0" and a0: "a$0 \<noteq> 0"
  1504   assumes r0: "(r (Suc k) (a$0)) ^ Suc k = a$0" and a0: "a$0 \<noteq> 0"
  1444   shows "(fps_radical r (Suc k) a) ^ (Suc k) = a"
  1505   shows "(fps_radical r (Suc k) a) ^ (Suc k) = a"
  1445 proof-
  1506 proof-
  1446   let ?r = "fps_radical r (Suc k) a"
  1507   let ?r = "fps_radical r (Suc k) a"
  1447   from a0 r0 have r00: "r (Suc k) (a$0) \<noteq> 0" by auto
  1508   from a0 r0 have r00: "r (Suc k) (a$0) \<noteq> 0" by auto
  1488       ultimately  show "?r ^ Suc k $ n = a $n" by (cases n, auto)
  1549       ultimately  show "?r ^ Suc k $ n = a $n" by (cases n, auto)
  1489   qed }
  1550   qed }
  1490   then show ?thesis by (simp add: fps_eq_iff)
  1551   then show ?thesis by (simp add: fps_eq_iff)
  1491 qed
  1552 qed
  1492 
  1553 
       
  1554 *)
  1493 lemma eq_divide_imp': assumes c0: "(c::'a::field) ~= 0" and eq: "a * c = b"
  1555 lemma eq_divide_imp': assumes c0: "(c::'a::field) ~= 0" and eq: "a * c = b"
  1494   shows "a = b / c"
  1556   shows "a = b / c"
  1495 proof-
  1557 proof-
  1496   from eq have "a * c * inverse c = b * inverse c" by simp
  1558   from eq have "a * c * inverse c = b * inverse c" by simp
  1497   hence "a * (inverse c * c) = b/c" by (simp only: field_simps divide_inverse)
  1559   hence "a * (inverse c * c) = b/c" by (simp only: field_simps divide_inverse)
  1504   shows "a^(Suc k) = b \<longleftrightarrow> a = fps_radical r (Suc k) b"
  1566   shows "a^(Suc k) = b \<longleftrightarrow> a = fps_radical r (Suc k) b"
  1505 proof-
  1567 proof-
  1506   let ?r = "fps_radical r (Suc k) b"
  1568   let ?r = "fps_radical r (Suc k) b"
  1507   have r00: "r (Suc k) (b$0) \<noteq> 0" using b0 r0 by auto
  1569   have r00: "r (Suc k) (b$0) \<noteq> 0" using b0 r0 by auto
  1508   {assume H: "a = ?r"
  1570   {assume H: "a = ?r"
  1509     from H have "a^Suc k = b" using power_radical[of r k, OF r0 b0] by simp}
  1571     from H have "a^Suc k = b" using power_radical[OF b0, of r k, unfolded r0] by simp}
  1510   moreover
  1572   moreover
  1511   {assume H: "a^Suc k = b"
  1573   {assume H: "a^Suc k = b"
  1512     (* Generally a$0 would need to be the k+1 st root of b$0 *)
       
  1513     have ceq: "card {0..k} = Suc k" by simp
  1574     have ceq: "card {0..k} = Suc k" by simp
  1514     have fk: "finite {0..k}" by simp
  1575     have fk: "finite {0..k}" by simp
  1515     from a0 have a0r0: "a$0 = ?r$0" by simp
  1576     from a0 have a0r0: "a$0 = ?r$0" by simp
  1516     {fix n have "a $ n = ?r $ n"
  1577     {fix n have "a $ n = ?r $ n"
  1517       proof(induct n rule: nat_less_induct)
  1578       proof(induct n rule: nat_less_induct)
  1615   let ?w = "(fps_const (of_nat (Suc k)) * ?r ^ k)"
  1676   let ?w = "(fps_const (of_nat (Suc k)) * ?r ^ k)"
  1616   from a0 r0 have r0': "r (Suc k) (a$0) \<noteq> 0" by auto
  1677   from a0 r0 have r0': "r (Suc k) (a$0) \<noteq> 0" by auto
  1617   from r0' have w0: "?w $ 0 \<noteq> 0" by (simp del: of_nat_Suc)
  1678   from r0' have w0: "?w $ 0 \<noteq> 0" by (simp del: of_nat_Suc)
  1618   note th0 = inverse_mult_eq_1[OF w0]
  1679   note th0 = inverse_mult_eq_1[OF w0]
  1619   let ?iw = "inverse ?w"
  1680   let ?iw = "inverse ?w"
  1620   from power_radical[of r, OF r0 a0]
  1681   from iffD1[OF power_radical[of a r], OF a0 r0]
  1621   have "fps_deriv (?r ^ Suc k) = fps_deriv a" by simp
  1682   have "fps_deriv (?r ^ Suc k) = fps_deriv a" by simp
  1622   hence "fps_deriv ?r * ?w = fps_deriv a"
  1683   hence "fps_deriv ?r * ?w = fps_deriv a"
  1623     by (simp add: fps_deriv_power mult_ac del: power_Suc)
  1684     by (simp add: fps_deriv_power mult_ac del: power_Suc)
  1624   hence "?iw * fps_deriv ?r * ?w = ?iw * fps_deriv a" by simp
  1685   hence "?iw * fps_deriv ?r * ?w = ?iw * fps_deriv a" by simp
  1625   hence "fps_deriv ?r * (?iw * ?w) = fps_deriv a / ?w"
  1686   hence "fps_deriv ?r * (?iw * ?w) = fps_deriv a / ?w"
  1628 qed
  1689 qed
  1629 
  1690 
  1630 lemma radical_mult_distrib:
  1691 lemma radical_mult_distrib:
  1631   fixes a:: "'a ::{field, ring_char_0} fps"
  1692   fixes a:: "'a ::{field, ring_char_0} fps"
  1632   assumes
  1693   assumes
  1633   ra0: "r (k) (a $ 0) ^ k = a $ 0"
  1694   k: "k > 0"
  1634   and rb0: "r (k) (b $ 0) ^ k = b $ 0"
  1695   and ra0: "r k (a $ 0) ^ k = a $ 0"
  1635   and r0': "r (k) ((a * b) $ 0) = r (k) (a $ 0) * r (k) (b $ 0)"
  1696   and rb0: "r k (b $ 0) ^ k = b $ 0"
       
  1697   and a0: "a$0 \<noteq> 0"
       
  1698   and b0: "b$0 \<noteq> 0"
       
  1699   shows "r k ((a * b) $ 0) = r k (a $ 0) * r k (b $ 0) \<longleftrightarrow> fps_radical r (k) (a*b) = fps_radical r (k) a * fps_radical r (k) (b)"
       
  1700 proof-
       
  1701   {assume  r0': "r k ((a * b) $ 0) = r k (a $ 0) * r k (b $ 0)"
       
  1702   from r0' have r0: "(r (k) ((a*b)$0)) ^ k = (a*b)$0"
       
  1703     by (simp add: fps_mult_nth ra0 rb0 power_mult_distrib)
       
  1704   {assume "k=0" hence ?thesis using r0' by simp}
       
  1705   moreover
       
  1706   {fix h assume k: "k = Suc h"
       
  1707   let ?ra = "fps_radical r (Suc h) a"
       
  1708   let ?rb = "fps_radical r (Suc h) b"
       
  1709   have th0: "r (Suc h) ((a * b) $ 0) = (fps_radical r (Suc h) a * fps_radical r (Suc h) b) $ 0"
       
  1710     using r0' k by (simp add: fps_mult_nth)
       
  1711   have ab0: "(a*b) $ 0 \<noteq> 0" using a0 b0 by (simp add: fps_mult_nth)
       
  1712   from radical_unique[of r h "a*b" "fps_radical r (Suc h) a * fps_radical r (Suc h) b", OF r0[unfolded k] th0 ab0, symmetric]
       
  1713     iffD1[OF power_radical[of _ r], OF a0 ra0[unfolded k]] iffD1[OF power_radical[of _ r], OF b0 rb0[unfolded k]] k r0'
       
  1714   have ?thesis by (auto simp add: power_mult_distrib simp del: power_Suc)}
       
  1715 ultimately have ?thesis by (cases k, auto)}
       
  1716 moreover
       
  1717 {assume h: "fps_radical r k (a*b) = fps_radical r k a * fps_radical r k b"
       
  1718   hence "(fps_radical r k (a*b))$0 = (fps_radical r k a * fps_radical r k b)$0" by simp
       
  1719   then have "r k ((a * b) $ 0) = r k (a $ 0) * r k (b $ 0)"
       
  1720     using k by (simp add: fps_mult_nth)}
       
  1721 ultimately show ?thesis by blast
       
  1722 qed
       
  1723 
       
  1724 (*
       
  1725 lemma radical_mult_distrib:
       
  1726   fixes a:: "'a ::{field, ring_char_0} fps"
       
  1727   assumes
       
  1728   ra0: "r k (a $ 0) ^ k = a $ 0"
       
  1729   and rb0: "r k (b $ 0) ^ k = b $ 0"
       
  1730   and r0': "r k ((a * b) $ 0) = r k (a $ 0) * r k (b $ 0)"
  1636   and a0: "a$0 \<noteq> 0"
  1731   and a0: "a$0 \<noteq> 0"
  1637   and b0: "b$0 \<noteq> 0"
  1732   and b0: "b$0 \<noteq> 0"
  1638   shows "fps_radical r (k) (a*b) = fps_radical r (k) a * fps_radical r (k) (b)"
  1733   shows "fps_radical r (k) (a*b) = fps_radical r (k) a * fps_radical r (k) (b)"
  1639 proof-
  1734 proof-
  1640   from r0' have r0: "(r (k) ((a*b)$0)) ^ k = (a*b)$0"
  1735   from r0' have r0: "(r (k) ((a*b)$0)) ^ k = (a*b)$0"
  1650   from radical_unique[of r h "a*b" "fps_radical r (Suc h) a * fps_radical r (Suc h) b", OF r0[unfolded k] th0 ab0, symmetric]
  1745   from radical_unique[of r h "a*b" "fps_radical r (Suc h) a * fps_radical r (Suc h) b", OF r0[unfolded k] th0 ab0, symmetric]
  1651     power_radical[of r, OF ra0[unfolded k] a0] power_radical[of r, OF rb0[unfolded k] b0] k
  1746     power_radical[of r, OF ra0[unfolded k] a0] power_radical[of r, OF rb0[unfolded k] b0] k
  1652   have ?thesis by (auto simp add: power_mult_distrib simp del: power_Suc)}
  1747   have ?thesis by (auto simp add: power_mult_distrib simp del: power_Suc)}
  1653 ultimately show ?thesis by (cases k, auto)
  1748 ultimately show ?thesis by (cases k, auto)
  1654 qed
  1749 qed
       
  1750 *)
       
  1751 
       
  1752 lemma fps_divide_1[simp]: "(a:: ('a::field) fps) / 1 = a"
       
  1753   by (simp add: fps_divide_def)
       
  1754 
       
  1755 lemma radical_divide:
       
  1756   fixes a:: "'a ::{field, ring_char_0} fps"
       
  1757   assumes
       
  1758   kp: "k>0"
       
  1759   and ra0: "(r k (a $ 0)) ^ k = a $ 0"
       
  1760   and rb0: "(r k (b $ 0)) ^ k = b $ 0"
       
  1761   and r1: "(r k 1)^k = 1"
       
  1762   and a0: "a$0 \<noteq> 0"
       
  1763   and b0: "b$0 \<noteq> 0"
       
  1764   shows "r k ((a $ 0) / (b$0)) = r k (a$0) / r k (b $ 0) \<longleftrightarrow> fps_radical r k (a/b) = fps_radical r k a / fps_radical r k b" (is "?lhs = ?rhs")
       
  1765 proof-
       
  1766   let ?r = "fps_radical r k"
       
  1767   from kp obtain h where k: "k = Suc h" by (cases k, auto)
       
  1768   have ra0': "r k (a$0) \<noteq> 0" using a0 ra0 k by auto
       
  1769   have rb0': "r k (b$0) \<noteq> 0" using b0 rb0 k by auto
       
  1770 
       
  1771   {assume ?rhs
       
  1772     then have "?r (a/b) $ 0 = (?r a / ?r b)$0" by simp
       
  1773     then have ?lhs using k a0 b0 rb0' 
       
  1774       by (simp add: fps_divide_def fps_mult_nth fps_inverse_def divide_inverse) }
       
  1775   moreover
       
  1776   {assume h: ?lhs
       
  1777     from a0 b0 have ab0[simp]: "(a/b)$0 = a$0 / b$0" 
       
  1778       by (simp add: fps_divide_def fps_mult_nth divide_inverse fps_inverse_def)
       
  1779     have th0: "r k ((a/b)$0) ^ k = (a/b)$0"
       
  1780       by (simp add: h nonzero_power_divide[OF rb0'] ra0 rb0 del: k)
       
  1781     from a0 b0 ra0' rb0' kp h 
       
  1782     have th1: "r k ((a / b) $ 0) = (fps_radical r k a / fps_radical r k b) $ 0"
       
  1783       by (simp add: fps_divide_def fps_mult_nth fps_inverse_def divide_inverse del: k)
       
  1784     from a0 b0 ra0' rb0' kp have ab0': "(a / b) $ 0 \<noteq> 0"
       
  1785       by (simp add: fps_divide_def fps_mult_nth fps_inverse_def nonzero_imp_inverse_nonzero)
       
  1786     note tha[simp] = iffD1[OF power_radical[where r=r and k=h], OF a0 ra0[unfolded k], unfolded k[symmetric]]
       
  1787     note thb[simp] = iffD1[OF power_radical[where r=r and k=h], OF b0 rb0[unfolded k], unfolded k[symmetric]]
       
  1788     have th2: "(?r a / ?r b)^k = a/b"
       
  1789       by (simp add: fps_divide_def power_mult_distrib fps_inverse_power[symmetric])
       
  1790     from iffD1[OF radical_unique[where r=r and a="?r a / ?r b" and b="a/b" and k=h], symmetric, unfolded k[symmetric], OF th0 th1 ab0' th2] have ?rhs .}
       
  1791   ultimately show ?thesis by blast
       
  1792 qed
  1655 
  1793 
  1656 lemma radical_inverse:
  1794 lemma radical_inverse:
  1657   fixes a:: "'a ::{field, ring_char_0} fps"
  1795   fixes a:: "'a ::{field, ring_char_0} fps"
  1658   assumes
  1796   assumes
  1659   ra0: "r (k) (a $ 0) ^ k = a $ 0"
  1797   k: "k>0"
  1660   and ria0: "r (k) (inverse (a $ 0)) = inverse (r (k) (a $ 0))"
  1798   and ra0: "r k (a $ 0) ^ k = a $ 0"
  1661   and r1: "(r (k) 1) = 1"
  1799   and r1: "(r k 1)^k = 1"
  1662   and a0: "a$0 \<noteq> 0"
  1800   and a0: "a$0 \<noteq> 0"
  1663   shows "fps_radical r (k) (inverse a) = inverse (fps_radical r (k) a)"
  1801   shows "r k (inverse (a $ 0)) = r k 1 / (r k (a $ 0)) \<longleftrightarrow> fps_radical r k (inverse a) = fps_radical r k 1 / fps_radical r k a"
  1664 proof-
  1802   using radical_divide[where k=k and r=r and a=1 and b=a, OF k ] ra0 r1 a0
  1665   {assume "k=0" then have ?thesis by simp}
  1803   by (simp add: divide_inverse fps_divide_def)
  1666   moreover
       
  1667   {fix h assume k[simp]: "k = Suc h"
       
  1668     let ?ra = "fps_radical r (Suc h) a"
       
  1669     let ?ria = "fps_radical r (Suc h) (inverse a)"
       
  1670     from ra0 a0 have th00: "r (Suc h) (a$0) \<noteq> 0" by auto
       
  1671     have ria0': "r (Suc h) (inverse a $ 0) ^ Suc h = inverse a$0"
       
  1672     using ria0 ra0 a0
       
  1673     by (simp add: fps_inverse_def  nonzero_power_inverse[OF th00, symmetric]
       
  1674              del: power_Suc)
       
  1675   from inverse_mult_eq_1[OF a0] have th0: "a * inverse a = 1"
       
  1676     by (simp add: mult_commute)
       
  1677   from radical_unique[where a=1 and b=1 and r=r and k=h, simplified, OF r1[unfolded k]]
       
  1678   have th01: "fps_radical r (Suc h) 1 = 1" .
       
  1679   have th1: "r (Suc h) ((a * inverse a) $ 0) ^ Suc h = (a * inverse a) $ 0"
       
  1680     "r (Suc h) ((a * inverse a) $ 0) =
       
  1681 r (Suc h) (a $ 0) * r (Suc h) (inverse a $ 0)"
       
  1682     using r1 unfolding th0  apply (simp_all add: ria0[symmetric])
       
  1683     apply (simp add: fps_inverse_def a0)
       
  1684     unfolding ria0[unfolded k]
       
  1685     using th00 by simp
       
  1686   from nonzero_imp_inverse_nonzero[OF a0] a0
       
  1687   have th2: "inverse a $ 0 \<noteq> 0" by (simp add: fps_inverse_def)
       
  1688   from radical_mult_distrib[of r "Suc h" a "inverse a", OF ra0[unfolded k] ria0' th1(2) a0 th2]
       
  1689   have th3: "?ra * ?ria = 1" unfolding th0 th01 by simp
       
  1690   from th00 have ra0: "?ra $ 0 \<noteq> 0" by simp
       
  1691   from fps_inverse_unique[OF ra0 th3] have ?thesis by simp}
       
  1692 ultimately show ?thesis by (cases k, auto)
       
  1693 qed
       
  1694 
       
  1695 lemma fps_divide_inverse: "(a::('a::field) fps) / b = a * inverse b"
       
  1696   by (simp add: fps_divide_def)
       
  1697 
       
  1698 lemma radical_divide:
       
  1699   fixes a:: "'a ::{field, ring_char_0} fps"
       
  1700   assumes
       
  1701       ra0: "r k (a $ 0) ^ k = a $ 0"
       
  1702   and rb0: "r k (b $ 0) ^ k = b $ 0"
       
  1703   and r1: "r k 1 = 1"
       
  1704   and rb0': "r k (inverse (b $ 0)) = inverse (r k (b $ 0))"
       
  1705   and raib': "r k (a$0 / (b$0)) = r k (a$0) / r k (b$0)"
       
  1706   and a0: "a$0 \<noteq> 0"
       
  1707   and b0: "b$0 \<noteq> 0"
       
  1708   shows "fps_radical r k (a/b) = fps_radical r k a / fps_radical r k b"
       
  1709 proof-
       
  1710   from raib'
       
  1711   have raib: "r k (a$0 / (b$0)) = r k (a$0) * r k (inverse (b$0))"
       
  1712     by (simp add: divide_inverse rb0'[symmetric])
       
  1713 
       
  1714   {assume "k=0" hence ?thesis by (simp add: fps_divide_def)}
       
  1715   moreover
       
  1716   {assume k0: "k\<noteq> 0"
       
  1717     from b0 k0 rb0 have rbn0: "r k (b $0) \<noteq> 0"
       
  1718       by (auto simp add: power_0_left)
       
  1719 
       
  1720     from rb0 rb0' have rib0: "(r k (inverse (b $ 0)))^k = inverse (b$0)"
       
  1721     by (simp add: nonzero_power_inverse[OF rbn0, symmetric])
       
  1722   from rib0 have th0: "r k (inverse b $ 0) ^ k = inverse b $ 0"
       
  1723     by (simp add:fps_inverse_def b0)
       
  1724   from raib
       
  1725   have th1: "r k ((a * inverse b) $ 0) = r k (a $ 0) * r k (inverse b $ 0)"
       
  1726     by (simp add: divide_inverse fps_inverse_def  b0 fps_mult_nth)
       
  1727   from nonzero_imp_inverse_nonzero[OF b0] b0 have th2: "inverse b $ 0 \<noteq> 0"
       
  1728     by (simp add: fps_inverse_def)
       
  1729   from radical_mult_distrib[of r k a "inverse b", OF ra0 th0 th1 a0 th2]
       
  1730   have th: "fps_radical r k (a/b) = fps_radical r k a * fps_radical r k (inverse b)"
       
  1731     by (simp add: fps_divide_def)
       
  1732   with radical_inverse[of r k b, OF rb0 rb0' r1 b0]
       
  1733   have ?thesis by (simp add: fps_divide_def)}
       
  1734 ultimately show ?thesis by blast
       
  1735 qed
       
  1736 
  1804 
  1737 subsection{* Derivative of composition *}
  1805 subsection{* Derivative of composition *}
  1738 
  1806 
  1739 lemma fps_compose_deriv:
  1807 lemma fps_compose_deriv:
  1740   fixes a:: "('a::idom) fps"
  1808   fixes a:: "('a::idom) fps"