636 pochhammer b (Suc n))" |
636 pochhammer b (Suc n))" |
637 by (subst sum.atMost_Suc_shift) (simp add: ring_distribs sum.distrib) |
637 by (subst sum.atMost_Suc_shift) (simp add: ring_distribs sum.distrib) |
638 also have "(\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a (Suc i) * pochhammer b (n - i)) = |
638 also have "(\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a (Suc i) * pochhammer b (n - i)) = |
639 a * pochhammer ((a + 1) + b) n" |
639 a * pochhammer ((a + 1) + b) n" |
640 by (subst Suc) (simp add: sum_distrib_left pochhammer_rec mult_ac) |
640 by (subst Suc) (simp add: sum_distrib_left pochhammer_rec mult_ac) |
641 also have "(\<Sum>i\<le>n. of_nat (n choose Suc i) * pochhammer a (Suc i) * pochhammer b (n - i)) + |
641 also have "(\<Sum>i\<le>n. of_nat(n choose Suc i) * pochhammer a (Suc i) * pochhammer b (n-i)) + pochhammer b (Suc n) |
642 pochhammer b (Suc n) = |
642 = of_nat (n choose 0) * pochhammer a 0 * pochhammer b (Suc n - 0) |
643 (\<Sum>i=0..Suc n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc n - i))" |
643 + (\<Sum>i = Suc 0..Suc n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc n - i))" |
644 apply (subst sum.atLeast_Suc_atMost, simp) |
644 unfolding sum.shift_bounds_cl_Suc_ivl by (simp add: atLeast0AtMost) |
645 apply (simp add: sum.shift_bounds_cl_Suc_ivl atLeast0AtMost del: sum.cl_ivl_Suc) |
645 also have "\<dots> = (\<Sum>i=0..Suc n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc n - i))" |
646 done |
646 by (simp add: sum.atLeast_Suc_atMost) |
647 also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc n - i))" |
647 also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc n - i))" |
648 using Suc by (intro sum.mono_neutral_right) (auto simp: not_le binomial_eq_0) |
648 using Suc by (intro sum.mono_neutral_right) (auto simp: not_le binomial_eq_0) |
649 also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc (n - i)))" |
649 also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc (n - i)))" |
650 by (intro sum.cong) (simp_all add: Suc_diff_le) |
650 by (simp add: Suc_diff_le) |
651 also have "\<dots> = b * pochhammer (a + (b + 1)) n" |
651 also have "\<dots> = b * pochhammer (a + (b + 1)) n" |
652 by (subst Suc) (simp add: sum_distrib_left mult_ac pochhammer_rec) |
652 by (subst Suc) (simp add: sum_distrib_left mult_ac pochhammer_rec) |
653 also have "a * pochhammer ((a + 1) + b) n + b * pochhammer (a + (b + 1)) n = |
653 also have "a * pochhammer ((a + 1) + b) n + b * pochhammer (a + (b + 1)) n = |
654 pochhammer (a + b) (Suc n)" |
654 pochhammer (a + b) (Suc n)" |
655 by (simp add: pochhammer_rec algebra_simps) |
655 by (simp add: pochhammer_rec algebra_simps) |
698 |
698 |
699 lemma gbinomial_negated_upper: "(a gchoose k) = (-1) ^ k * ((of_nat k - a - 1) gchoose k)" |
699 lemma gbinomial_negated_upper: "(a gchoose k) = (-1) ^ k * ((of_nat k - a - 1) gchoose k)" |
700 by (simp add: gbinomial_pochhammer pochhammer_minus algebra_simps) |
700 by (simp add: gbinomial_pochhammer pochhammer_minus algebra_simps) |
701 |
701 |
702 lemma gbinomial_minus: "((-a) gchoose k) = (-1) ^ k * ((a + of_nat k - 1) gchoose k)" |
702 lemma gbinomial_minus: "((-a) gchoose k) = (-1) ^ k * ((a + of_nat k - 1) gchoose k)" |
703 by (subst gbinomial_negated_upper) (simp add: add_ac) |
703 by (metis add.commute diff_minus_eq_add gbinomial_negated_upper) |
704 |
704 |
705 lemma Suc_times_gbinomial: "of_nat (Suc k) * ((a + 1) gchoose (Suc k)) = (a + 1) * (a gchoose k)" |
705 lemma Suc_times_gbinomial: "of_nat (Suc k) * ((a + 1) gchoose (Suc k)) = (a + 1) * (a gchoose k)" |
706 proof (cases k) |
706 proof (cases k) |
707 case 0 |
707 case 0 |
708 then show ?thesis by simp |
708 then show ?thesis by simp |
709 next |
709 next |
710 case (Suc b) |
710 case Suc |
711 then have "((a + 1) gchoose (Suc (Suc b))) = (\<Prod>i = 0..Suc b. a + (1 - of_nat i)) / fact (b + 2)" |
711 have "((a + 1) gchoose (Suc k)) = (\<Prod>i = 0..k. a + (1 - of_nat i)) / fact (Suc k)" |
712 by (simp add: field_simps gbinomial_prod_rev atLeastLessThanSuc_atLeastAtMost) |
712 by (simp add: add_diff_eq gbinomial_Suc) |
713 also have "(\<Prod>i = 0..Suc b. a + (1 - of_nat i)) = (a + 1) * (\<Prod>i = 0..b. a - of_nat i)" |
713 also have "(\<Prod>i = 0..k. a + (1 - of_nat i)) = (a + 1) * (\<Prod>i = 0..k-1. a - of_nat i)" |
714 by (simp add: prod.atLeast0_atMost_Suc_shift del: prod.cl_ivl_Suc) |
714 by (simp add: Suc prod.atLeast0_atMost_Suc_shift del: prod.cl_ivl_Suc) |
715 also have "\<dots> / fact (b + 2) = (a + 1) / of_nat (Suc (Suc b)) * (a gchoose Suc b)" |
715 also have "\<dots> / fact (Suc k) = (a + 1) / of_nat (Suc k) * (a gchoose k)" |
716 by (simp_all add: gbinomial_prod_rev atLeastLessThanSuc_atLeastAtMost) |
716 by (simp_all add: Suc gbinomial_prod_rev atLeastLessThanSuc_atLeastAtMost) |
717 finally show ?thesis by (simp add: Suc field_simps del: of_nat_Suc) |
717 finally show ?thesis |
|
718 using of_nat_neq_0 by auto |
718 qed |
719 qed |
719 |
720 |
720 lemma gbinomial_factors: "((a + 1) gchoose (Suc k)) = (a + 1) / of_nat (Suc k) * (a gchoose k)" |
721 lemma gbinomial_factors: "((a + 1) gchoose (Suc k)) = (a + 1) / of_nat (Suc k) * (a gchoose k)" |
721 proof (cases k) |
722 by (metis Suc_times_gbinomial nonzero_mult_div_cancel_left of_nat_neq_0 times_divide_eq_left) |
722 case 0 |
|
723 then show ?thesis by simp |
|
724 next |
|
725 case (Suc b) |
|
726 then have "((a + 1) gchoose (Suc (Suc b))) = (\<Prod>i = 0 .. Suc b. a + (1 - of_nat i)) / fact (b + 2)" |
|
727 by (simp add: field_simps gbinomial_prod_rev atLeastLessThanSuc_atLeastAtMost) |
|
728 also have "(\<Prod>i = 0 .. Suc b. a + (1 - of_nat i)) = (a + 1) * (\<Prod>i = 0..b. a - of_nat i)" |
|
729 by (simp add: prod.atLeast0_atMost_Suc_shift del: prod.cl_ivl_Suc) |
|
730 also have "\<dots> / fact (b + 2) = (a + 1) / of_nat (Suc (Suc b)) * (a gchoose Suc b)" |
|
731 by (simp_all add: gbinomial_prod_rev atLeastLessThanSuc_atLeastAtMost atLeast0AtMost) |
|
732 finally show ?thesis |
|
733 by (simp add: Suc) |
|
734 qed |
|
735 |
723 |
736 lemma gbinomial_rec: "((a + 1) gchoose (Suc k)) = (a gchoose k) * ((a + 1) / of_nat (Suc k))" |
724 lemma gbinomial_rec: "((a + 1) gchoose (Suc k)) = (a gchoose k) * ((a + 1) / of_nat (Suc k))" |
737 using gbinomial_mult_1[of a k] |
725 by (simp add: gbinomial_factors mult.commute plus_1_eq_Suc) |
738 by (subst gbinomial_Suc_Suc) (simp add: field_simps del: of_nat_Suc, simp add: algebra_simps) |
|
739 |
726 |
740 lemma gbinomial_of_nat_symmetric: "k \<le> n \<Longrightarrow> (of_nat n) gchoose k = (of_nat n) gchoose (n - k)" |
727 lemma gbinomial_of_nat_symmetric: "k \<le> n \<Longrightarrow> (of_nat n) gchoose k = (of_nat n) gchoose (n - k)" |
741 using binomial_symmetric[of k n] by (simp add: binomial_gbinomial [symmetric]) |
728 using binomial_symmetric[of k n] by (simp add: binomial_gbinomial [symmetric]) |
742 |
729 |
743 |
730 |
754 restriction \<^cite>\<open>\<open>p.~157\<close> in GKP_CM\<close>: |
741 restriction \<^cite>\<open>\<open>p.~157\<close> in GKP_CM\<close>: |
755 \[ |
742 \[ |
756 k{r \choose k} = r{r - 1 \choose k - 1}, \quad \textnormal{integer } k. |
743 k{r \choose k} = r{r - 1 \choose k - 1}, \quad \textnormal{integer } k. |
757 \]\<close> |
744 \]\<close> |
758 lemma gbinomial_absorption: "of_nat (Suc k) * (a gchoose Suc k) = a * ((a - 1) gchoose k)" |
745 lemma gbinomial_absorption: "of_nat (Suc k) * (a gchoose Suc k) = a * ((a - 1) gchoose k)" |
759 using gbinomial_absorption'[of "Suc k" a] by (simp add: field_simps del: of_nat_Suc) |
746 by (metis Suc_times_gbinomial diff_eq_eq) |
760 |
747 |
761 text \<open>The absorption identity for natural number binomial coefficients:\<close> |
748 text \<open>The absorption identity for natural number binomial coefficients:\<close> |
762 lemma binomial_absorption: "Suc k * (n choose Suc k) = n * ((n - 1) choose k)" |
749 lemma binomial_absorption: "Suc k * (n choose Suc k) = n * ((n - 1) choose k)" |
763 by (cases n) (simp_all add: binomial_eq_0 Suc_times_binomial del: binomial_Suc_Suc mult_Suc) |
750 using times_binomial_minus1_eq by fastforce |
764 |
751 |
765 text \<open>The absorption companion identity for natural number coefficients, |
752 text \<open>The absorption companion identity for natural number coefficients, |
766 following the proof by GKP \<^cite>\<open>\<open>p.~157\<close> in GKP_CM\<close>:\<close> |
753 following the proof by GKP \<^cite>\<open>\<open>p.~157\<close> in GKP_CM\<close>:\<close> |
767 lemma binomial_absorb_comp: "(n - k) * (n choose k) = n * ((n - 1) choose k)" |
754 lemma binomial_absorb_comp: "(n - k) * (n choose k) = n * ((n - 1) choose k)" |
768 (is "?lhs = ?rhs") |
755 (is "?lhs = ?rhs") |
837 lemma gbinomial_index_swap: |
824 lemma gbinomial_index_swap: |
838 "((-1) ^ k) * ((- (of_nat n) - 1) gchoose k) = ((-1) ^ n) * ((- (of_nat k) - 1) gchoose n)" |
825 "((-1) ^ k) * ((- (of_nat n) - 1) gchoose k) = ((-1) ^ n) * ((- (of_nat k) - 1) gchoose n)" |
839 (is "?lhs = ?rhs") |
826 (is "?lhs = ?rhs") |
840 proof - |
827 proof - |
841 have "?lhs = (of_nat (k + n) gchoose k)" |
828 have "?lhs = (of_nat (k + n) gchoose k)" |
842 by (subst gbinomial_negated_upper) (simp add: power_mult_distrib [symmetric]) |
829 by (simp add: gbinomial_negated_upper [of "- of_nat n - 1"]) |
843 also have "\<dots> = (of_nat (k + n) gchoose n)" |
830 also have "\<dots> = (of_nat (k + n) gchoose n)" |
844 by (subst gbinomial_of_nat_symmetric) simp_all |
831 by (subst gbinomial_of_nat_symmetric; simp) |
845 also have "\<dots> = ?rhs" |
832 also have "\<dots> = ?rhs" |
846 by (subst gbinomial_negated_upper) simp |
833 by (subst gbinomial_negated_upper; simp) |
847 finally show ?thesis . |
834 finally show ?thesis . |
848 qed |
835 qed |
849 |
836 |
850 lemma gbinomial_sum_lower_neg: "(\<Sum>k\<le>m. (a gchoose k) * (- 1) ^ k) = (- 1) ^ m * (a - 1 gchoose m)" |
837 lemma gbinomial_sum_lower_neg: "(\<Sum>k\<le>m. (a gchoose k) * (- 1) ^ k) = (- 1) ^ m * (a - 1 gchoose m)" |
851 (is "?lhs = ?rhs") |
838 (is "?lhs = ?rhs") |
852 proof - |
839 proof - |
853 have "?lhs = (\<Sum>k\<le>m. -(a + 1) + of_nat k gchoose k)" |
840 have "?lhs = (\<Sum>k\<le>m. -(a + 1) + of_nat k gchoose k)" |
854 by (intro sum.cong[OF refl]) (subst gbinomial_negated_upper, simp add: power_mult_distrib) |
841 by (simp add: gbinomial_negated_upper [of a] power_mult_distrib diff_add_eq mult.commute) |
855 also have "\<dots> = - a + of_nat m gchoose m" |
842 also have "\<dots> = - a + of_nat m gchoose m" |
856 by (subst gbinomial_parallel_sum) simp |
843 by (simp add: gbinomial_parallel_sum) |
857 also have "\<dots> = ?rhs" |
844 also have "\<dots> = ?rhs" |
858 by (subst gbinomial_negated_upper) (simp add: power_mult_distrib) |
845 by (simp add: gbinomial_negated_upper [of "a-1"] power_mult_distrib) |
859 finally show ?thesis . |
846 finally show ?thesis . |
860 qed |
847 qed |
861 |
848 |
862 lemma gbinomial_partial_row_sum: |
849 lemma gbinomial_partial_row_sum: |
863 "(\<Sum>k\<le>m. (a gchoose k) * ((a / 2) - of_nat k)) = ((of_nat m + 1)/2) * (a gchoose (m + 1))" |
850 "(\<Sum>k\<le>m. (a gchoose k) * ((a / 2) - of_nat k)) = ((of_nat m + 1)/2) * (a gchoose (m + 1))" |
885 (is "?lhs m = ?rhs m") |
872 (is "?lhs m = ?rhs m") |
886 proof (induction m) |
873 proof (induction m) |
887 case 0 |
874 case 0 |
888 then show ?case by simp |
875 then show ?case by simp |
889 next |
876 next |
890 case (Suc mm) |
877 case (Suc m) |
891 define G where "G i k = (of_nat i + a gchoose k) * x^k * y^(i - k)" for i k |
878 define G where "G i k = (of_nat i + a gchoose k) * x^k * y^(i - k)" for i k |
892 define S where "S = ?lhs" |
879 define S where "S = ?lhs" |
893 have SG_def: "S = (\<lambda>i. (\<Sum>k\<le>i. (G i k)))" |
880 have SG_def: "S = (\<lambda>i. (\<Sum>k\<le>i. (G i k)))" |
894 unfolding S_def G_def .. |
881 unfolding S_def G_def .. |
895 |
882 |
896 have "S (Suc mm) = G (Suc mm) 0 + (\<Sum>k=Suc 0..Suc mm. G (Suc mm) k)" |
883 have "S (Suc m) = G (Suc m) 0 + (\<Sum>k=Suc 0..Suc m. G (Suc m) k)" |
897 using SG_def by (simp add: sum.atLeast_Suc_atMost atLeast0AtMost [symmetric]) |
884 using SG_def by (simp add: sum.atLeast_Suc_atMost atLeast0AtMost [symmetric]) |
898 also have "(\<Sum>k=Suc 0..Suc mm. G (Suc mm) k) = (\<Sum>k=0..mm. G (Suc mm) (Suc k))" |
885 also have "(\<Sum>k=Suc 0..Suc m. G (Suc m) k) = (\<Sum>k=0..m. G (Suc m) (Suc k))" |
899 by (subst sum.shift_bounds_cl_Suc_ivl) simp |
886 by (subst sum.shift_bounds_cl_Suc_ivl) simp |
900 also have "\<dots> = (\<Sum>k=0..mm. ((of_nat mm + a gchoose (Suc k)) + |
887 also have "\<dots> = (\<Sum>k=0..m. ((of_nat m + a gchoose (Suc k)) + |
901 (of_nat mm + a gchoose k)) * x^(Suc k) * y^(mm - k))" |
888 (of_nat m + a gchoose k)) * x^(Suc k) * y^(m - k))" |
902 unfolding G_def by (subst gbinomial_addition_formula) simp |
889 unfolding G_def by (subst gbinomial_addition_formula) simp |
903 also have "\<dots> = (\<Sum>k=0..mm. (of_nat mm + a gchoose (Suc k)) * x^(Suc k) * y^(mm - k)) + |
890 also have "\<dots> = (\<Sum>k=0..m. (of_nat m + a gchoose (Suc k)) * x^(Suc k) * y^(m - k)) + |
904 (\<Sum>k=0..mm. (of_nat mm + a gchoose k) * x^(Suc k) * y^(mm - k))" |
891 (\<Sum>k=0..m. (of_nat m + a gchoose k) * x^(Suc k) * y^(m - k))" |
905 by (subst sum.distrib [symmetric]) (simp add: algebra_simps) |
892 by (subst sum.distrib [symmetric]) (simp add: algebra_simps) |
906 also have "(\<Sum>k=0..mm. (of_nat mm + a gchoose (Suc k)) * x^(Suc k) * y^(mm - k)) = |
893 also have "(\<Sum>k=0..m. (of_nat m + a gchoose (Suc k)) * x^(Suc k) * y^(m - k)) = |
907 (\<Sum>k<Suc mm. (of_nat mm + a gchoose (Suc k)) * x^(Suc k) * y^(mm - k))" |
894 (\<Sum>k<Suc m. (of_nat m + a gchoose (Suc k)) * x^(Suc k) * y^(m - k))" |
908 by (simp only: atLeast0AtMost lessThan_Suc_atMost) |
895 by (simp only: atLeast0AtMost lessThan_Suc_atMost) |
909 also have "\<dots> = (\<Sum>k<mm. (of_nat mm + a gchoose Suc k) * x^(Suc k) * y^(mm-k)) + |
896 also have "\<dots> = (\<Sum>k<m. (of_nat m + a gchoose Suc k) * x^(Suc k) * y^(m-k)) + |
910 (of_nat mm + a gchoose (Suc mm)) * x^(Suc mm)" |
897 (of_nat m + a gchoose (Suc m)) * x^(Suc m)" |
911 (is "_ = ?A + ?B") |
898 (is "_ = ?A + ?B") |
912 by (subst sum.lessThan_Suc) simp |
899 by (subst sum.lessThan_Suc) simp |
913 also have "?A = (\<Sum>k=1..mm. (of_nat mm + a gchoose k) * x^k * y^(mm - k + 1))" |
900 also have "?A = (\<Sum>k=1..m. (of_nat m + a gchoose k) * x^k * y^(m - k + 1))" |
914 proof (subst sum_bounds_lt_plus1 [symmetric], intro sum.cong[OF refl], clarify) |
901 proof (subst sum_bounds_lt_plus1 [symmetric], intro sum.cong[OF refl], clarify) |
915 fix k |
902 fix k |
916 assume "k < mm" |
903 assume "k < m" |
917 then have "mm - k = mm - Suc k + 1" |
904 then have "m - k = m - Suc k + 1" |
918 by linarith |
905 by linarith |
919 then show "(of_nat mm + a gchoose Suc k) * x ^ Suc k * y ^ (mm - k) = |
906 then show "(of_nat m + a gchoose Suc k) * x ^ Suc k * y ^ (m - k) = |
920 (of_nat mm + a gchoose Suc k) * x ^ Suc k * y ^ (mm - Suc k + 1)" |
907 (of_nat m + a gchoose Suc k) * x ^ Suc k * y ^ (m - Suc k + 1)" |
921 by (simp only:) |
908 by (simp only:) |
922 qed |
909 qed |
923 also have "\<dots> + ?B = y * (\<Sum>k=1..mm. (G mm k)) + (of_nat mm + a gchoose (Suc mm)) * x^(Suc mm)" |
910 also have "\<dots> + ?B = y * (\<Sum>k=1..m. (G m k)) + (of_nat m + a gchoose (Suc m)) * x^(Suc m)" |
924 unfolding G_def by (subst sum_distrib_left) (simp add: algebra_simps) |
911 unfolding G_def by (simp add: sum_distrib_left algebra_simps) |
925 also have "(\<Sum>k=0..mm. (of_nat mm + a gchoose k) * x^(Suc k) * y^(mm - k)) = x * (S mm)" |
912 also have "(\<Sum>k=0..m. (of_nat m + a gchoose k) * x^(Suc k) * y^(m - k)) = x * (S m)" |
926 unfolding S_def by (subst sum_distrib_left) (simp add: atLeast0AtMost algebra_simps) |
913 unfolding S_def by (simp add: sum_distrib_left atLeast0AtMost algebra_simps) |
927 also have "(G (Suc mm) 0) = y * (G mm 0)" |
914 also have "(G (Suc m) 0) = y * (G m 0)" |
928 by (simp add: G_def) |
915 by (simp add: G_def) |
929 finally have "S (Suc mm) = |
916 finally have "S (Suc m) = |
930 y * (G mm 0 + (\<Sum>k=1..mm. (G mm k))) + (of_nat mm + a gchoose (Suc mm)) * x^(Suc mm) + x * (S mm)" |
917 y * (G m 0 + (\<Sum>k=1..m. (G m k))) + (of_nat m + a gchoose (Suc m)) * x^(Suc m) + x * (S m)" |
931 by (simp add: ring_distribs) |
918 by (simp add: ring_distribs) |
932 also have "G mm 0 + (\<Sum>k=1..mm. (G mm k)) = S mm" |
919 also have "G m 0 + (\<Sum>k=1..m. (G m k)) = S m" |
933 by (simp add: sum.atLeast_Suc_atMost[symmetric] SG_def atLeast0AtMost) |
920 by (simp add: SG_def atLeast0AtMost flip: sum.atLeast_Suc_atMost) |
934 finally have "S (Suc mm) = (x + y) * (S mm) + (of_nat mm + a gchoose (Suc mm)) * x^(Suc mm)" |
921 finally have "S (Suc m) = (x + y) * (S m) + (of_nat m + a gchoose (Suc m)) * x^(Suc m)" |
935 by (simp add: algebra_simps) |
922 by (simp add: algebra_simps) |
936 also have "(of_nat mm + a gchoose (Suc mm)) = (-1) ^ (Suc mm) * (- a gchoose (Suc mm))" |
923 also have "(of_nat m + a gchoose (Suc m)) = (-1) ^ (Suc m) * (- a gchoose (Suc m))" |
937 by (subst gbinomial_negated_upper) simp |
924 by (subst gbinomial_negated_upper) simp |
938 also have "(-1) ^ Suc mm * (- a gchoose Suc mm) * x ^ Suc mm = |
925 also have "(-1) ^ Suc m * (- a gchoose Suc m) * x ^ Suc m = (- a gchoose (Suc m)) * (-x) ^ Suc m" |
939 (- a gchoose (Suc mm)) * (-x) ^ Suc mm" |
|
940 by (simp add: power_minus[of x]) |
926 by (simp add: power_minus[of x]) |
941 also have "(x + y) * S mm + \<dots> = (x + y) * ?rhs mm + (- a gchoose (Suc mm)) * (- x)^Suc mm" |
927 also have "(x + y) * S m + \<dots> = (x + y) * ?rhs m + (- a gchoose (Suc m)) * (- x)^Suc m" |
942 unfolding S_def by (subst Suc.IH) simp |
928 unfolding S_def by (simp add: Suc.IH) |
943 also have "(x + y) * ?rhs mm = (\<Sum>n\<le>mm. ((- a gchoose n) * (- x) ^ n * (x + y) ^ (Suc mm - n)))" |
929 also have "(x + y) * ?rhs m = (\<Sum>n\<le>m. ((- a gchoose n) * (- x) ^ n * (x + y) ^ (Suc m - n)))" |
944 by (subst sum_distrib_left, rule sum.cong) (simp_all add: Suc_diff_le) |
930 by (auto simp: Suc_diff_le sum_distrib_left intro!: sum.cong) |
945 also have "\<dots> + (-a gchoose (Suc mm)) * (-x)^Suc mm = |
931 also have "\<dots> + (-a gchoose (Suc m)) * (-x)^Suc m = |
946 (\<Sum>n\<le>Suc mm. (- a gchoose n) * (- x) ^ n * (x + y) ^ (Suc mm - n))" |
932 (\<Sum>n\<le>Suc m. (- a gchoose n) * (- x) ^ n * (x + y) ^ (Suc m - n))" |
947 by simp |
933 by simp |
948 finally show ?case |
934 finally show ?case |
949 by (simp only: S_def) |
935 by (simp only: S_def) |
950 qed |
936 qed |
951 |
937 |
953 "(\<Sum>k\<le>m. (of_nat m + a gchoose k) * x^k * y^(m-k)) = |
939 "(\<Sum>k\<le>m. (of_nat m + a gchoose k) * x^k * y^(m-k)) = |
954 (\<Sum>k\<le>m. (of_nat k + a - 1 gchoose k) * x^k * (x + y)^(m-k))" (is "?lhs = ?rhs") |
940 (\<Sum>k\<le>m. (of_nat k + a - 1 gchoose k) * x^k * (x + y)^(m-k))" (is "?lhs = ?rhs") |
955 proof - |
941 proof - |
956 have "?lhs = (\<Sum>k\<le>m. (- a gchoose k) * (- x) ^ k * (x + y) ^ (m - k))" |
942 have "?lhs = (\<Sum>k\<le>m. (- a gchoose k) * (- x) ^ k * (x + y) ^ (m - k))" |
957 by (simp add: gbinomial_partial_sum_poly) |
943 by (simp add: gbinomial_partial_sum_poly) |
958 also have "... = (\<Sum>k\<le>m. (-1) ^ k * (of_nat k - - a - 1 gchoose k) * (- x) ^ k * (x + y) ^ (m - k))" |
944 also have "\<dots> = (\<Sum>k\<le>m. (-1) ^ k * (of_nat k - - a - 1 gchoose k) * (- x) ^ k * (x + y) ^ (m - k))" |
959 by (metis (no_types, opaque_lifting) gbinomial_negated_upper) |
945 by (metis (no_types, opaque_lifting) gbinomial_negated_upper) |
960 also have "... = ?rhs" |
946 also have "\<dots> = ?rhs" |
961 by (intro sum.cong) (auto simp flip: power_mult_distrib) |
947 by (auto simp flip: power_mult_distrib intro: sum.cong) |
962 finally show ?thesis . |
948 finally show ?thesis . |
963 qed |
949 qed |
964 |
950 |
965 lemma binomial_r_part_sum: "(\<Sum>k\<le>m. (2 * m + 1 choose k)) = 2 ^ (2 * m)" |
951 lemma binomial_r_part_sum: "(\<Sum>k\<le>m. (2 * m + 1 choose k)) = 2 ^ (2 * m)" |
966 proof - |
952 proof - |
980 using sum.atLeastAtMost_rev [of "\<lambda>k. 2 * m + 1 choose (m - k)" 0 m] |
966 using sum.atLeastAtMost_rev [of "\<lambda>k. 2 * m + 1 choose (m - k)" 0 m] |
981 by simp |
967 by simp |
982 also have "\<dots> + \<dots> = 2 * \<dots>" |
968 also have "\<dots> + \<dots> = 2 * \<dots>" |
983 by simp |
969 by simp |
984 finally show ?thesis |
970 finally show ?thesis |
985 by (subst (asm) mult_cancel1) (simp add: atLeast0AtMost) |
971 by (simp add: atLeast0AtMost) |
986 qed |
972 qed |
987 |
973 |
988 lemma gbinomial_r_part_sum: "(\<Sum>k\<le>m. (2 * (of_nat m) + 1 gchoose k)) = 2 ^ (2 * m)" |
974 lemma gbinomial_r_part_sum: "(\<Sum>k\<le>m. (2 * (of_nat m) + 1 gchoose k)) = 2 ^ (2 * m)" |
989 (is "?lhs = ?rhs") |
975 (is "?lhs = ?rhs") |
990 proof - |
976 proof - |
991 have "?lhs = of_nat (\<Sum>k\<le>m. (2 * m + 1) choose k)" |
977 have "?lhs = of_nat (\<Sum>k\<le>m. (2 * m + 1) choose k)" |
992 by (simp add: binomial_gbinomial add_ac) |
978 by (simp add: binomial_gbinomial add_ac) |
993 also have "\<dots> = of_nat (2 ^ (2 * m))" |
979 also have "\<dots> = of_nat (2 ^ (2 * m))" |
994 by (subst binomial_r_part_sum) (rule refl) |
980 using binomial_r_part_sum by presburger |
995 finally show ?thesis by simp |
981 finally show ?thesis by simp |
996 qed |
982 qed |
997 |
983 |
998 lemma gbinomial_sum_nat_pow2: |
984 lemma gbinomial_sum_nat_pow2: |
999 "(\<Sum>k\<le>m. (of_nat (m + k) gchoose k :: 'a::field_char_0) / 2 ^ k) = 2 ^ m" |
985 "(\<Sum>k\<le>m. (of_nat (m + k) gchoose k :: 'a::field_char_0) / 2 ^ k) = 2 ^ m" |
1041 using assms by (subst binomial_fact_lemma[symmetric]) auto |
1027 using assms by (subst binomial_fact_lemma[symmetric]) auto |
1042 with fact_div_fact_le_pow [OF assms] show ?thesis |
1028 with fact_div_fact_le_pow [OF assms] show ?thesis |
1043 by auto |
1029 by auto |
1044 qed |
1030 qed |
1045 |
1031 |
1046 lemma binomial_altdef_nat: "k \<le> n \<Longrightarrow> n choose k = fact n div (fact k * fact (n - k))" |
|
1047 for k n :: nat |
|
1048 by (subst binomial_fact_lemma [symmetric]) auto |
|
1049 |
|
1050 lemma choose_dvd: |
1032 lemma choose_dvd: |
1051 assumes "k \<le> n" shows "fact k * fact (n - k) dvd (fact n :: 'a::linordered_semidom)" |
1033 assumes "k \<le> n" shows "fact k * fact (n - k) dvd (fact n)" |
1052 unfolding dvd_def |
1034 by (metis assms binomial_fact_lemma dvd_def of_nat_fact of_nat_mult) |
1053 proof |
|
1054 show "fact n = fact k * fact (n - k) * of_nat (n choose k)" |
|
1055 by (metis assms binomial_fact_lemma of_nat_fact of_nat_mult) |
|
1056 qed |
|
1057 |
1035 |
1058 lemma fact_fact_dvd_fact: |
1036 lemma fact_fact_dvd_fact: |
1059 "fact k * fact n dvd (fact (k + n) :: 'a::linordered_semidom)" |
1037 "fact k * fact n dvd (fact (k + n))" |
1060 by (metis add.commute add_diff_cancel_left' choose_dvd le_add2) |
1038 by (metis add.commute add_diff_cancel_left' choose_dvd le_add2) |
1061 |
1039 |
1062 lemma choose_mult_lemma: |
1040 lemma choose_mult_lemma: |
1063 "((m + r + k) choose (m + k)) * ((m + k) choose k) = ((m + r + k) choose k) * ((m + r) choose m)" |
1041 "((m + r + k) choose (m + k)) * ((m + k) choose k) = ((m + r + k) choose k) * ((m + r) choose m)" |
1064 (is "?lhs = _") |
1042 (is "?lhs = _") |
1065 proof - |
1043 proof - |
1066 have "?lhs = |
1044 have "?lhs = |
1067 fact (m + r + k) div (fact (m + k) * fact (m + r - m)) * (fact (m + k) div (fact k * fact m))" |
1045 fact (m + r + k) div (fact (m + k) * fact (m + r - m)) * (fact (m + k) div (fact k * fact m))" |
1068 by (simp add: binomial_altdef_nat) |
1046 by (simp add: binomial_fact') |
1069 also have "... = fact (m + r + k) * fact (m + k) div |
1047 also have "\<dots> = fact (m + r + k) * fact (m + k) div |
1070 (fact (m + k) * fact (m + r - m) * (fact k * fact m))" |
1048 (fact (m + k) * fact (m + r - m) * (fact k * fact m))" |
1071 by (metis add_implies_diff add_le_mono1 choose_dvd diff_cancel2 div_mult_div_if_dvd le_add1 le_add2) |
1049 by (metis add_implies_diff add_le_mono1 choose_dvd diff_cancel2 div_mult_div_if_dvd le_add1 le_add2) |
1072 also have "\<dots> = fact (m + r + k) div (fact r * (fact k * fact m))" |
1050 also have "\<dots> = fact (m + r + k) div (fact r * (fact k * fact m))" |
1073 by (auto simp: algebra_simps fact_fact_dvd_fact) |
1051 by (auto simp: algebra_simps fact_fact_dvd_fact) |
1074 also have "\<dots> = (fact (m + r + k) * fact (m + r)) div (fact r * (fact k * fact m) * fact (m + r))" |
1052 also have "\<dots> = (fact (m + r + k) * fact (m + r)) div (fact r * (fact k * fact m) * fact (m + r))" |
1075 by simp |
1053 by simp |
1076 also have "\<dots> = |
1054 also have "\<dots> = |
1077 (fact (m + r + k) div (fact k * fact (m + r)) * (fact (m + r) div (fact r * fact m)))" |
1055 (fact (m + r + k) div (fact k * fact (m + r)) * (fact (m + r) div (fact r * fact m)))" |
1078 by (auto simp: div_mult_div_if_dvd fact_fact_dvd_fact algebra_simps) |
1056 by (auto simp: div_mult_div_if_dvd fact_fact_dvd_fact algebra_simps) |
1079 finally show ?thesis |
1057 finally show ?thesis |
1080 by (simp add: binomial_altdef_nat mult.commute) |
1058 by (simp add: binomial_fact' mult.commute) |
1081 qed |
1059 qed |
1082 |
1060 |
1083 text \<open>The "Subset of a Subset" identity.\<close> |
1061 text \<open>The "Subset of a Subset" identity.\<close> |
1084 lemma choose_mult: |
1062 lemma choose_mult: |
1085 "k \<le> m \<Longrightarrow> m \<le> n \<Longrightarrow> (n choose m) * (m choose k) = (n choose k) * ((n - k) choose (m - k))" |
1063 "k \<le> m \<Longrightarrow> m \<le> n \<Longrightarrow> (n choose m) * (m choose k) = (n choose k) * ((n - k) choose (m - k))" |
1094 next |
1072 next |
1095 case (Suc l) |
1073 case (Suc l) |
1096 have "of_nat (n + 1) * (\<Prod>i=0..<k. of_nat (n - i)) = (of_nat :: (nat \<Rightarrow> 'a)) (n + 1 - k) * (\<Prod>i=0..<k. of_nat (Suc n - i))" |
1074 have "of_nat (n + 1) * (\<Prod>i=0..<k. of_nat (n - i)) = (of_nat :: (nat \<Rightarrow> 'a)) (n + 1 - k) * (\<Prod>i=0..<k. of_nat (Suc n - i))" |
1097 using prod.atLeast0_lessThan_Suc [where ?'a = 'a, symmetric, of "\<lambda>i. of_nat (Suc n - i)" k] |
1075 using prod.atLeast0_lessThan_Suc [where ?'a = 'a, symmetric, of "\<lambda>i. of_nat (Suc n - i)" k] |
1098 by (simp add: ac_simps prod.atLeast0_lessThan_Suc_shift del: prod.op_ivl_Suc) |
1076 by (simp add: ac_simps prod.atLeast0_lessThan_Suc_shift del: prod.op_ivl_Suc) |
1099 also have "... = (of_nat :: (nat \<Rightarrow> 'a)) (Suc n - k) * (\<Prod>i=0..<k. of_nat (Suc n - i))" |
1077 also have "\<dots> = (of_nat :: (nat \<Rightarrow> 'a)) (Suc n - k) * (\<Prod>i=0..<k. of_nat (Suc n - i))" |
1100 by (simp add: Suc atLeast0_atMost_Suc atLeastLessThanSuc_atLeastAtMost) |
1078 by (simp add: Suc atLeast0_atMost_Suc atLeastLessThanSuc_atLeastAtMost) |
1101 also have "... = (of_nat :: (nat \<Rightarrow> 'a)) (n + 1 - k) * (\<Prod>i=0..<k. of_nat (Suc n - i))" |
1079 also have "\<dots> = (of_nat :: (nat \<Rightarrow> 'a)) (n + 1 - k) * (\<Prod>i=0..<k. of_nat (Suc n - i))" |
1102 by (simp only: Suc_eq_plus1) |
1080 by (simp only: Suc_eq_plus1) |
1103 finally have "(\<Prod>i=0..<k. of_nat (n - i)) = (of_nat :: (nat \<Rightarrow> 'a)) (n + 1 - k) / of_nat (n + 1) * (\<Prod>i=0..<k. of_nat (Suc n - i))" |
1081 finally have "(\<Prod>i=0..<k. of_nat (n - i)) = (of_nat :: (nat \<Rightarrow> 'a)) (n + 1 - k) / of_nat (n + 1) * (\<Prod>i=0..<k. of_nat (Suc n - i))" |
1104 using of_nat_neq_0 by (auto simp: mult.commute divide_simps) |
1082 using of_nat_neq_0 by (auto simp: mult.commute divide_simps) |
1105 with assms show ?thesis |
1083 with assms show ?thesis |
1106 by (simp add: binomial_altdef_of_nat prod_dividef) |
1084 by (simp add: binomial_altdef_of_nat prod_dividef) |
1139 by (intro finite_subset[where ?A = "?A" and ?B = "{xs. size xs = m - 1 \<and> set xs \<subseteq> {0..<N+1}}"]) |
1117 by (intro finite_subset[where ?A = "?A" and ?B = "{xs. size xs = m - 1 \<and> set xs \<subseteq> {0..<N+1}}"]) |
1140 (auto simp: member_le_sum_list less_Suc_eq_le) |
1118 (auto simp: member_le_sum_list less_Suc_eq_le) |
1141 have fin_B: "finite ?B" |
1119 have fin_B: "finite ?B" |
1142 by (intro finite_subset[where ?A = "?B" and ?B = "{xs. size xs = m \<and> set xs \<subseteq> {0..<N}}"]) |
1120 by (intro finite_subset[where ?A = "?B" and ?B = "{xs. size xs = m \<and> set xs \<subseteq> {0..<N}}"]) |
1143 (auto simp: member_le_sum_list less_Suc_eq_le fin) |
1121 (auto simp: member_le_sum_list less_Suc_eq_le fin) |
1144 have uni: "?C = ?A' \<union> ?B'" |
1122 have disj: "?A' \<inter> ?B' = {}" by blast |
|
1123 have "?C = ?A' \<union> ?B'" |
1145 by auto |
1124 by auto |
1146 have disj: "?A' \<inter> ?B' = {}" by blast |
1125 then have "card ?C = card(?A' \<union> ?B')" |
1147 have "card ?C = card(?A' \<union> ?B')" |
1126 by simp |
1148 using uni by simp |
|
1149 also have "\<dots> = card ?A + card ?B" |
1127 also have "\<dots> = card ?A + card ?B" |
1150 using card_Un_disjoint[OF _ _ disj] bij_betw_finite[OF f] bij_betw_finite[OF g] |
1128 using card_Un_disjoint[OF _ _ disj] bij_betw_finite[OF f] bij_betw_finite[OF g] |
1151 bij_betw_same_card[OF f] bij_betw_same_card[OF g] fin_A fin_B |
1129 bij_betw_same_card[OF f] bij_betw_same_card[OF g] fin_A fin_B |
1152 by presburger |
1130 by presburger |
1153 finally show ?thesis . |
1131 finally show ?thesis . |
1231 |
1209 |
1232 lemma Suc_times_binomial_add: "Suc a * (Suc (a + b) choose Suc a) = Suc b * (Suc (a + b) choose a)" |
1210 lemma Suc_times_binomial_add: "Suc a * (Suc (a + b) choose Suc a) = Suc b * (Suc (a + b) choose a)" |
1233 \<comment> \<open>by Lukas Bulwahn\<close> |
1211 \<comment> \<open>by Lukas Bulwahn\<close> |
1234 proof - |
1212 proof - |
1235 have dvd: "Suc a * (fact a * fact b) dvd fact (Suc (a + b))" for a b |
1213 have dvd: "Suc a * (fact a * fact b) dvd fact (Suc (a + b))" for a b |
1236 using fact_fact_dvd_fact[of "Suc a" "b", where 'a=nat] |
1214 using fact_fact_dvd_fact[of "Suc a" "b"] |
1237 by (simp only: fact_Suc add_Suc[symmetric] of_nat_id mult.assoc) |
1215 by (metis add.commute add_Suc_right fact_Suc id_apply mult.assoc of_nat_eq_id) |
1238 have "Suc a * (fact (Suc (a + b)) div (Suc a * fact a * fact b)) = |
1216 have "Suc a * (fact (Suc (a + b)) div (Suc a * fact a * fact b)) = |
1239 Suc a * fact (Suc (a + b)) div (Suc a * (fact a * fact b))" |
1217 Suc a * fact (Suc (a + b)) div (Suc a * (fact a * fact b))" |
1240 by (subst div_mult_swap[symmetric]; simp only: mult.assoc dvd) |
1218 by (metis mult.assoc div_mult_swap dvd) |
1241 also have "\<dots> = Suc b * fact (Suc (a + b)) div (Suc b * (fact a * fact b))" |
1219 also have "\<dots> = Suc b * fact (Suc (a + b)) div (Suc b * (fact a * fact b))" |
1242 by (simp only: div_mult_mult1) |
1220 by (simp only: div_mult_mult1) |
1243 also have "\<dots> = Suc b * (fact (Suc (a + b)) div (Suc b * (fact a * fact b)))" |
1221 also have "\<dots> = Suc b * (fact (Suc (a + b)) div (Suc b * (fact a * fact b)))" |
1244 using dvd[of b a] by (subst div_mult_swap[symmetric]; simp only: ac_simps dvd) |
1222 by (metis add.commute div_mult_swap dvd mult.commute) |
1245 finally show ?thesis |
1223 finally show ?thesis |
1246 by (subst (1 2) binomial_altdef_nat) |
1224 by (metis Suc_diff_le Suc_eq_plus1 Suc_times_binomial add.commute binomial_absorb_comp diff_add_inverse le_add1) |
1247 (simp_all only: ac_simps diff_Suc_Suc Suc_diff_le diff_add_inverse fact_Suc of_nat_id) |
|
1248 qed |
1225 qed |
1249 |
1226 |
1250 subsection \<open>Inclusion-exclusion principle\<close> |
1227 subsection \<open>Inclusion-exclusion principle\<close> |
1251 |
1228 |
1252 text \<open>Ported from HOL Light by lcp\<close> |
1229 text \<open>Ported from HOL Light by lcp\<close> |
1311 have PUXA: "P (\<Union> (X ` A))" |
1288 have PUXA: "P (\<Union> (X ` A))" |
1312 using \<open>finite A\<close> APX |
1289 using \<open>finite A\<close> APX |
1313 by (induction) (auto simp: empty Un) |
1290 by (induction) (auto simp: empty Un) |
1314 have "f (\<Union> (X ` A0)) = f (X a \<union> \<Union> (X ` A))" |
1291 have "f (\<Union> (X ` A0)) = f (X a \<union> \<Union> (X ` A))" |
1315 by (simp add: *) |
1292 by (simp add: *) |
1316 also have "... = f (X a) + f (\<Union> (X ` A)) - f (X a \<inter> \<Union> (X ` A))" |
1293 also have "\<dots> = f (X a) + f (\<Union> (X ` A)) - f (X a \<inter> \<Union> (X ` A))" |
1317 using f_Un_Int add_diff_cancel PUXA \<open>P (X a)\<close> by metis |
1294 using f_Un_Int add_diff_cancel PUXA \<open>P (X a)\<close> by metis |
1318 also have "... = f (X a) - (\<Sum>B | B \<subseteq> A \<and> B \<noteq> {}. (- 1) ^ card B * f (\<Inter> (X ` B))) + |
1295 also have "\<dots> = f (X a) - (\<Sum>B | B \<subseteq> A \<and> B \<noteq> {}. (- 1) ^ card B * f (\<Inter> (X ` B))) + |
1319 (\<Sum>B | B \<subseteq> A \<and> B \<noteq> {}. (- 1) ^ card B * f (X a \<inter> \<Inter> (X ` B)))" |
1296 (\<Sum>B | B \<subseteq> A \<and> B \<noteq> {}. (- 1) ^ card B * f (X a \<inter> \<Inter> (X ` B)))" |
1320 proof - |
1297 proof - |
1321 have 1: "f (\<Union>i\<in>A. X a \<inter> X i) = (\<Sum>B | B \<subseteq> A \<and> B \<noteq> {}. (- 1) ^ (card B + 1) * f (\<Inter>b\<in>B. X a \<inter> X b))" |
1298 have 1: "f (\<Union>i\<in>A. X a \<inter> X i) = (\<Sum>B | B \<subseteq> A \<and> B \<noteq> {}. (- 1) ^ (card B + 1) * f (\<Inter>b\<in>B. X a \<inter> X b))" |
1322 using less.IH [of n A "\<lambda>i. X a \<inter> X i"] APX Int \<open>P (X a)\<close> by (simp add: *) |
1299 using less.IH [of n A "\<lambda>i. X a \<inter> X i"] APX Int \<open>P (X a)\<close> by (simp add: *) |
1323 have 2: "X a \<inter> \<Union> (X ` A) = (\<Union>i\<in>A. X a \<inter> X i)" |
1300 have 2: "X a \<inter> \<Union> (X ` A) = (\<Union>i\<in>A. X a \<inter> X i)" |
1517 using that by (simp add: \<open>finite S\<close> finite_subset \<section>) |
1494 using that by (simp add: \<open>finite S\<close> finite_subset \<section>) |
1518 qed |
1495 qed |
1519 then have "(\<Sum>T \<in> Pow S. (-1) ^ card T * g T) |
1496 then have "(\<Sum>T \<in> Pow S. (-1) ^ card T * g T) |
1520 = (\<Sum>T\<in>Pow S. (-1) ^ card T * (\<Sum>U | U \<in> {U. U \<subseteq> S} \<and> U \<subseteq> T. (-1) ^ card U * f U))" |
1497 = (\<Sum>T\<in>Pow S. (-1) ^ card T * (\<Sum>U | U \<in> {U. U \<subseteq> S} \<and> U \<subseteq> T. (-1) ^ card U * f U))" |
1521 by simp |
1498 by simp |
1522 also have "... = (\<Sum>U\<in>Pow S. (\<Sum>T | T \<subseteq> S \<and> U \<subseteq> T. (-1) ^ card T) * (-1) ^ card U * f U)" |
1499 also have "\<dots> = (\<Sum>U\<in>Pow S. (\<Sum>T | T \<subseteq> S \<and> U \<subseteq> T. (-1) ^ card T) * (-1) ^ card U * f U)" |
1523 unfolding sum_distrib_left |
1500 unfolding sum_distrib_left |
1524 by (subst sum.swap_restrict; simp add: \<open>finite S\<close> algebra_simps sum_distrib_right Pow_def) |
1501 by (subst sum.swap_restrict; simp add: \<open>finite S\<close> algebra_simps sum_distrib_right Pow_def) |
1525 also have "... = (\<Sum>U\<in>Pow S. if U=S then f S else 0)" |
1502 also have "\<dots> = (\<Sum>U\<in>Pow S. if U=S then f S else 0)" |
1526 proof - |
1503 proof - |
1527 have [simp]: "{T. T \<subseteq> S \<and> S \<subseteq> T} = {S}" |
1504 have [simp]: "{T. T \<subseteq> S \<and> S \<subseteq> T} = {S}" |
1528 by auto |
1505 by auto |
1529 show ?thesis |
1506 show ?thesis |
1530 apply (rule sum.cong [OF refl]) |
1507 apply (rule sum.cong [OF refl]) |
1531 by (simp add: sum_alternating_cancels card_subsupersets_even_odd \<open>finite S\<close> flip: power_add) |
1508 by (simp add: sum_alternating_cancels card_subsupersets_even_odd \<open>finite S\<close> flip: power_add) |
1532 qed |
1509 qed |
1533 also have "... = f S" |
1510 also have "\<dots> = f S" |
1534 by (simp add: \<open>finite S\<close>) |
1511 by (simp add: \<open>finite S\<close>) |
1535 finally show ?thesis |
1512 finally show ?thesis |
1536 by presburger |
1513 by presburger |
1537 qed |
1514 qed |
1538 |
1515 |