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 |
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" |