src/HOL/Binomial.thy
changeset 83066 aad65db60c80
parent 81579 cf4bebd770b5
child 83072 3edaac4585e8
equal deleted inserted replaced
83065:0a1a054d9b23 83066:aad65db60c80
   593       (\<Sum>i\<le>Suc m. (-1) ^ i * of_nat i * of_nat (Suc m choose i))"
   593       (\<Sum>i\<le>Suc m. (-1) ^ i * of_nat i * of_nat (Suc m choose i))"
   594     by (simp add: Suc)
   594     by (simp add: Suc)
   595   also have "\<dots> = (\<Sum>i\<le>m. (-1) ^ (Suc i) * of_nat (Suc i * (Suc m choose Suc i)))"
   595   also have "\<dots> = (\<Sum>i\<le>m. (-1) ^ (Suc i) * of_nat (Suc i * (Suc m choose Suc i)))"
   596     by (simp only: sum.atMost_Suc_shift sum_distrib_left[symmetric] mult_ac of_nat_mult) simp
   596     by (simp only: sum.atMost_Suc_shift sum_distrib_left[symmetric] mult_ac of_nat_mult) simp
   597   also have "\<dots> = - of_nat (Suc m) * (\<Sum>i\<le>m. (-1) ^ i * of_nat (m choose i))"
   597   also have "\<dots> = - of_nat (Suc m) * (\<Sum>i\<le>m. (-1) ^ i * of_nat (m choose i))"
   598     by (subst sum_distrib_left, rule sum.cong[OF refl], subst Suc_times_binomial)
   598     proof (subst sum_distrib_left, rule sum.cong[OF refl], subst Suc_times_binomial)
   599        (simp add: algebra_simps)
   599     qed (simp add: algebra_simps)
   600   also have "(\<Sum>i\<le>m. (-1 :: 'a) ^ i * of_nat ((m choose i))) = 0"
   600   also have "(\<Sum>i\<le>m. (-1 :: 'a) ^ i * of_nat ((m choose i))) = 0"
   601     using choose_alternating_sum[OF \<open>m > 0\<close>] by simp
   601     using choose_alternating_sum[OF \<open>m > 0\<close>] by simp
   602   finally show ?thesis
   602   finally show ?thesis
   603     by simp
   603     by simp
   604 qed
   604 qed
   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")
   789   "a gchoose (Suc k) = ((a - 1) gchoose (Suc k)) + ((a - 1) gchoose k)"
   776   "a gchoose (Suc k) = ((a - 1) gchoose (Suc k)) + ((a - 1) gchoose k)"
   790   using gbinomial_Suc_Suc[of "a - 1" k] by (simp add: algebra_simps)
   777   using gbinomial_Suc_Suc[of "a - 1" k] by (simp add: algebra_simps)
   791 
   778 
   792 lemma binomial_addition_formula:
   779 lemma binomial_addition_formula:
   793   "0 < n \<Longrightarrow> n choose (Suc k) = ((n - 1) choose (Suc k)) + ((n - 1) choose k)"
   780   "0 < n \<Longrightarrow> n choose (Suc k) = ((n - 1) choose (Suc k)) + ((n - 1) choose k)"
   794   by (subst choose_reduce_nat) simp_all
   781   by (metis Suc_diff_1 add.commute binomial_Suc_Suc)
   795 
   782 
   796 text \<open>
   783 text \<open>
   797   Equation 5.9 of the reference material \<^cite>\<open>\<open>p.~159\<close> in GKP_CM\<close> is a useful
   784   Equation 5.9 of the reference material \<^cite>\<open>\<open>p.~159\<close> in GKP_CM\<close> is a useful
   798   summation formula, operating on both indices:
   785   summation formula, operating on both indices:
   799   \[
   786   \[
   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"
  1005     using gbinomial_r_part_sum ..
   991     using gbinomial_r_part_sum ..
  1006   also have "\<dots> = (\<Sum>k\<le>m. (of_nat (m + k) gchoose k) * 2 ^ (m - k))"
   992   also have "\<dots> = (\<Sum>k\<le>m. (of_nat (m + k) gchoose k) * 2 ^ (m - k))"
  1007     using gbinomial_partial_sum_poly_xpos[where x="1" and y="1" and a="of_nat m + 1" and m="m"]
   993     using gbinomial_partial_sum_poly_xpos[where x="1" and y="1" and a="of_nat m + 1" and m="m"]
  1008     by (simp add: add_ac)
   994     by (simp add: add_ac)
  1009   also have "\<dots> = 2 ^ m * (\<Sum>k\<le>m. (of_nat (m + k) gchoose k) / 2 ^ k)"
   995   also have "\<dots> = 2 ^ m * (\<Sum>k\<le>m. (of_nat (m + k) gchoose k) / 2 ^ k)"
  1010     by (subst sum_distrib_left) (simp add: algebra_simps power_diff)
   996     by (simp add: sum_distrib_left algebra_simps power_diff)
  1011   finally show ?thesis
   997   finally show ?thesis
  1012     by (subst (asm) mult_left_cancel) simp_all
   998     by (subst (asm) mult_left_cancel) simp_all
  1013 qed
   999 qed
  1014 
  1000 
  1015 lemma gbinomial_trinomial_revision:
  1001 lemma gbinomial_trinomial_revision:
  1029   for n k :: nat and x :: "'a::field_char_0"
  1015   for n k :: nat and x :: "'a::field_char_0"
  1030   by (simp add: gbinomial_altdef_of_nat binomial_gbinomial of_nat_diff)
  1016   by (simp add: gbinomial_altdef_of_nat binomial_gbinomial of_nat_diff)
  1031 
  1017 
  1032 lemma binomial_ge_n_over_k_pow_k: "k \<le> n \<Longrightarrow> (of_nat n / of_nat k :: 'a) ^ k \<le> of_nat (n choose k)"
  1018 lemma binomial_ge_n_over_k_pow_k: "k \<le> n \<Longrightarrow> (of_nat n / of_nat k :: 'a) ^ k \<le> of_nat (n choose k)"
  1033   for k n :: nat and x :: "'a::linordered_field"
  1019   for k n :: nat and x :: "'a::linordered_field"
  1034   by (simp add: gbinomial_ge_n_over_k_pow_k binomial_gbinomial of_nat_diff)
  1020   by (simp add: binomial_gbinomial gbinomial_ge_n_over_k_pow_k)
  1035 
  1021 
  1036 lemma binomial_le_pow:
  1022 lemma binomial_le_pow:
  1037   assumes "r \<le> n"
  1023   assumes "r \<le> n"
  1038   shows "n choose r \<le> n ^ r"
  1024   shows "n choose r \<le> n ^ r"
  1039 proof -
  1025 proof -
  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 .
  1213 proof (induction xs ys rule: shuffles.induct)
  1191 proof (induction xs ys rule: shuffles.induct)
  1214   case (3 x xs y ys)
  1192   case (3 x xs y ys)
  1215   have "shuffles (x # xs) (y # ys) = (#) x ` shuffles xs (y # ys) \<union> (#) y ` shuffles (x # xs) ys"
  1193   have "shuffles (x # xs) (y # ys) = (#) x ` shuffles xs (y # ys) \<union> (#) y ` shuffles (x # xs) ys"
  1216     by (rule shuffles.simps)
  1194     by (rule shuffles.simps)
  1217   also have "card \<dots> = card ((#) x ` shuffles xs (y # ys)) + card ((#) y ` shuffles (x # xs) ys)"
  1195   also have "card \<dots> = card ((#) x ` shuffles xs (y # ys)) + card ((#) y ` shuffles (x # xs) ys)"
  1218     by (rule card_Un_disjoint) (insert "3.prems", auto)
  1196     by (rule card_Un_disjoint) (use 3 in auto)
  1219   also have "card ((#) x ` shuffles xs (y # ys)) = card (shuffles xs (y # ys))"
  1197   also have "card ((#) x ` shuffles xs (y # ys)) = card (shuffles xs (y # ys))"
  1220     by (rule card_image) auto
  1198     by (rule card_image) auto
  1221   also have "\<dots> = (length xs + length (y # ys)) choose length xs"
  1199   also have "\<dots> = (length xs + length (y # ys)) choose length xs"
  1222     using "3.prems" by (intro "3.IH") auto
  1200     using "3.prems" by (intro "3.IH") auto
  1223   also have "card ((#) y ` shuffles (x # xs) ys) = card (shuffles (x # xs) ys)"
  1201   also have "card ((#) y ` shuffles (x # xs) ys) = card (shuffles (x # xs) ys)"
  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)"
  1326           using less.IH [of n A X] APX Int \<open>P (X a)\<close>  by (simp add: *)
  1303           using less.IH [of n A X] APX Int \<open>P (X a)\<close>  by (simp add: *)
  1327         show ?thesis
  1304         show ?thesis
  1328           unfolding 3 2 1
  1305           unfolding 3 2 1
  1329           by (simp add: sum_negf)
  1306           by (simp add: sum_negf)
  1330       qed
  1307       qed
  1331       also have "... = (\<Sum>B | B \<subseteq> A0 \<and> B \<noteq> {}. (- 1) ^ (card B + 1) * f (\<Inter> (X ` B)))"
  1308       also have "\<dots> = (\<Sum>B | B \<subseteq> A0 \<and> B \<noteq> {}. (- 1) ^ (card B + 1) * f (\<Inter> (X ` B)))"
  1332       proof -
  1309       proof -
  1333          have F: "{insert a B |B. B \<subseteq> A} = insert a ` Pow A \<and> {B. B \<subseteq> A \<and> B \<noteq> {}} = Pow A - {{}}"
  1310          have F: "{insert a B |B. B \<subseteq> A} = insert a ` Pow A \<and> {B. B \<subseteq> A \<and> B \<noteq> {}} = Pow A - {{}}"
  1334           by auto
  1311           by auto
  1335         have G: "(\<Sum>B\<in>Pow A. (- 1) ^ card (insert a B) * f (X a \<inter> \<Inter> (X ` B))) = (\<Sum>B\<in>Pow A. - ((- 1) ^ card B * f (X a \<inter> \<Inter> (X ` B))))"
  1312         have G: "(\<Sum>B\<in>Pow A. (- 1) ^ card (insert a B) * f (X a \<inter> \<Inter> (X ` B))) = (\<Sum>B\<in>Pow A. - ((- 1) ^ card B * f (X a \<inter> \<Inter> (X ` B))))"
  1336         proof (rule sum.cong [OF refl])
  1313         proof (rule sum.cong [OF refl])
  1408   have card_eq: "card ` {I. I \<subseteq> A \<and> I \<noteq> {}} = {1..card A}"
  1385   have card_eq: "card ` {I. I \<subseteq> A \<and> I \<noteq> {}} = {1..card A}"
  1409     using not_less_eq_eq card_mono by (fastforce simp: image_iff)
  1386     using not_less_eq_eq card_mono by (fastforce simp: image_iff)
  1410   have "int(card(\<Union> A)) 
  1387   have "int(card(\<Union> A)) 
  1411       = (\<Sum>y = 1..card A. \<Sum>I\<in>{x. x \<subseteq> A \<and> x \<noteq> {} \<and> card x = y}. - ((- 1) ^ y * int (card (\<Inter> I))))"
  1388       = (\<Sum>y = 1..card A. \<Sum>I\<in>{x. x \<subseteq> A \<and> x \<noteq> {} \<and> card x = y}. - ((- 1) ^ y * int (card (\<Inter> I))))"
  1412     by (simp add: int_card_UNION assms sum.image_gen [OF fin, where g=card] card_eq)
  1389     by (simp add: int_card_UNION assms sum.image_gen [OF fin, where g=card] card_eq)
  1413   also have "... = ?R"
  1390   also have "\<dots> = ?R"
  1414   proof -
  1391   proof -
  1415     have "{B. B \<subseteq> A \<and> B \<noteq> {} \<and> card B = k} = {B. B \<subseteq> A \<and> card B = k}"
  1392     have "{B. B \<subseteq> A \<and> B \<noteq> {} \<and> card B = k} = {B. B \<subseteq> A \<and> card B = k}"
  1416       if "Suc 0 \<le> k" and "k \<le> card A" for k
  1393       if "Suc 0 \<le> k" and "k \<le> card A" for k
  1417       using that by auto
  1394       using that by auto
  1418     then show ?thesis
  1395     then show ?thesis
  1495   shows "(\<Sum>x\<in>S. (-1) ^ f x) = (0::'b::ring_1)"
  1472   shows "(\<Sum>x\<in>S. (-1) ^ f x) = (0::'b::ring_1)"
  1496 proof -
  1473 proof -
  1497   have "(\<Sum>x\<in>S. (-1) ^ f x)
  1474   have "(\<Sum>x\<in>S. (-1) ^ f x)
  1498       = (\<Sum>x | x \<in> S \<and> even (f x). (-1) ^ f x) + (\<Sum>x | x \<in> S \<and> odd (f x). (-1) ^ f x)"
  1475       = (\<Sum>x | x \<in> S \<and> even (f x). (-1) ^ f x) + (\<Sum>x | x \<in> S \<and> odd (f x). (-1) ^ f x)"
  1499     by (rule sum_Un_eq [symmetric]; force simp: \<open>finite S\<close>)
  1476     by (rule sum_Un_eq [symmetric]; force simp: \<open>finite S\<close>)
  1500   also have "... = (0::'b::ring_1)"
  1477   also have "\<dots> = (0::'b::ring_1)"
  1501     by (simp add: minus_one_power_iff assms cong: conj_cong)
  1478     by (simp add: minus_one_power_iff assms cong: conj_cong)
  1502   finally show ?thesis .
  1479   finally show ?thesis .
  1503 qed
  1480 qed
  1504 
  1481 
  1505 lemma inclusion_exclusion_symmetric:
  1482 lemma inclusion_exclusion_symmetric:
  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 
  1546     by (rule inclusion_exclusion_symmetric; simp add: assms flip: power_add mult.assoc)
  1523     by (rule inclusion_exclusion_symmetric; simp add: assms flip: power_add mult.assoc)
  1547   then have "((- 1) ^ card S * (- 1) ^ card S) * f S = ((- 1) ^ card S) * (\<Sum>T\<in>Pow S. (- 1) ^ card T * g T)"
  1524   then have "((- 1) ^ card S * (- 1) ^ card S) * f S = ((- 1) ^ card S) * (\<Sum>T\<in>Pow S. (- 1) ^ card T * g T)"
  1548     by (simp add: mult_ac)
  1525     by (simp add: mult_ac)
  1549   then have "f S = (\<Sum>T\<in>Pow S. (- 1) ^ (card S + card T) * g T)"
  1526   then have "f S = (\<Sum>T\<in>Pow S. (- 1) ^ (card S + card T) * g T)"
  1550     by (simp add: sum_distrib_left flip: power_add mult.assoc)
  1527     by (simp add: sum_distrib_left flip: power_add mult.assoc)
  1551   also have "... = ?rhs"
  1528   also have "\<dots> = ?rhs"
  1552     by (simp add: \<open>finite S\<close> card_mono neg_one_power_add_eq_neg_one_power_diff)
  1529     by (simp add: \<open>finite S\<close> card_mono neg_one_power_add_eq_neg_one_power_diff)
  1553   finally show ?thesis .
  1530   finally show ?thesis .
  1554 qed
  1531 qed
  1555 
  1532 
  1556 
  1533 
  1558 
  1535 
  1559 lemma gbinomial_code [code]:
  1536 lemma gbinomial_code [code]:
  1560   "a gchoose k =
  1537   "a gchoose k =
  1561     (if k = 0 then 1
  1538     (if k = 0 then 1
  1562      else fold_atLeastAtMost_nat (\<lambda>k acc. (a - of_nat k) * acc) 0 (k - 1) 1 / fact k)"
  1539      else fold_atLeastAtMost_nat (\<lambda>k acc. (a - of_nat k) * acc) 0 (k - 1) 1 / fact k)"
  1563   by (cases k)
  1540   by (cases k) (simp_all add: gbinomial_prod_rev atLeastLessThanSuc_atLeastAtMost flip: prod_atLeastAtMost_code)
  1564     (simp_all add: gbinomial_prod_rev prod_atLeastAtMost_code [symmetric]
       
  1565       atLeastLessThanSuc_atLeastAtMost)
       
  1566 
  1541 
  1567 lemma binomial_code [code]:
  1542 lemma binomial_code [code]:
  1568   "n choose k =
  1543   "n choose k =
  1569       (if k > n then 0
  1544       (if k > n then 0
  1570        else if 2 * k > n then n choose (n - k)
  1545        else if 2 * k > n then n choose (n - k)
  1571        else (fold_atLeastAtMost_nat (*) (n - k + 1) n 1 div fact k))"
  1546        else (fold_atLeastAtMost_nat (*) (n - k + 1) n 1 div fact k))"
  1572 proof -
  1547 proof -
  1573   {
  1548   {
  1574     assume "k \<le> n"
  1549     assume "k \<le> n"
  1575     then have "{1..n} = {1..n-k} \<union> {n-k+1..n}" by auto
       
  1576     then have "(fact n :: nat) = fact (n-k) * \<Prod>{n-k+1..n}"
  1550     then have "(fact n :: nat) = fact (n-k) * \<Prod>{n-k+1..n}"
  1577       by (simp add: prod.union_disjoint fact_prod)
  1551       by (metis Suc_eq_plus1 diff_le_self fact_eq_fact_times)
  1578   }
  1552   }
  1579   then show ?thesis by (auto simp: binomial_altdef_nat mult_ac prod_atLeastAtMost_code)
  1553   then show ?thesis by (auto simp: binomial_fact' mult_ac prod_atLeastAtMost_code)
  1580 qed
  1554 qed
  1581 
  1555 
  1582 end
  1556 end