src/HOL/Binomial.thy
changeset 64267 b9a1486e79be
parent 64240 eabf80376aab
child 64272 f76b6dda2e56
equal deleted inserted replaced
64265:8eb6365f5916 64267:b9a1486e79be
   339   also have "\<dots> = a * (\<Sum>k=0..n. of_nat (n choose k) * a^k * b^(n-k)) +
   339   also have "\<dots> = a * (\<Sum>k=0..n. of_nat (n choose k) * a^k * b^(n-k)) +
   340       b * (\<Sum>k=0..n. of_nat (n choose k) * a^k * b^(n-k))"
   340       b * (\<Sum>k=0..n. of_nat (n choose k) * a^k * b^(n-k))"
   341     by (rule distrib_right)
   341     by (rule distrib_right)
   342   also have "\<dots> = (\<Sum>k=0..n. of_nat (n choose k) * a^(k+1) * b^(n-k)) +
   342   also have "\<dots> = (\<Sum>k=0..n. of_nat (n choose k) * a^(k+1) * b^(n-k)) +
   343       (\<Sum>k=0..n. of_nat (n choose k) * a^k * b^(n - k + 1))"
   343       (\<Sum>k=0..n. of_nat (n choose k) * a^k * b^(n - k + 1))"
   344     by (auto simp add: setsum_distrib_left ac_simps)
   344     by (auto simp add: sum_distrib_left ac_simps)
   345   also have "\<dots> = (\<Sum>k=0..n. of_nat (n choose k) * a^k * b^(n + 1 - k)) +
   345   also have "\<dots> = (\<Sum>k=0..n. of_nat (n choose k) * a^k * b^(n + 1 - k)) +
   346       (\<Sum>k=1..n+1. of_nat (n choose (k - 1)) * a^k * b^(n + 1 - k))"
   346       (\<Sum>k=1..n+1. of_nat (n choose (k - 1)) * a^k * b^(n + 1 - k))"
   347     by (simp add:setsum_shift_bounds_cl_Suc_ivl Suc_diff_le field_simps del: setsum_cl_ivl_Suc)
   347     by (simp add:sum_shift_bounds_cl_Suc_ivl Suc_diff_le field_simps del: sum_cl_ivl_Suc)
   348   also have "\<dots> = a^(n + 1) + b^(n + 1) +
   348   also have "\<dots> = a^(n + 1) + b^(n + 1) +
   349       (\<Sum>k=1..n. of_nat (n choose (k - 1)) * a^k * b^(n + 1 - k)) +
   349       (\<Sum>k=1..n. of_nat (n choose (k - 1)) * a^k * b^(n + 1 - k)) +
   350       (\<Sum>k=1..n. of_nat (n choose k) * a^k * b^(n + 1 - k))"
   350       (\<Sum>k=1..n. of_nat (n choose k) * a^k * b^(n + 1 - k))"
   351     by (simp add: decomp2)
   351     by (simp add: decomp2)
   352   also have "\<dots> = a^(n + 1) + b^(n + 1) +
   352   also have "\<dots> = a^(n + 1) + b^(n + 1) +
   353       (\<Sum>k=1..n. of_nat (n + 1 choose k) * a^k * b^(n + 1 - k))"
   353       (\<Sum>k=1..n. of_nat (n + 1 choose k) * a^k * b^(n + 1 - k))"
   354     by (auto simp add: field_simps setsum.distrib [symmetric] choose_reduce_nat)
   354     by (auto simp add: field_simps sum.distrib [symmetric] choose_reduce_nat)
   355   also have "\<dots> = (\<Sum>k=0..n+1. of_nat (n + 1 choose k) * a^k * b^(n + 1 - k))"
   355   also have "\<dots> = (\<Sum>k=0..n+1. of_nat (n + 1 choose k) * a^k * b^(n + 1 - k))"
   356     using decomp by (simp add: field_simps)
   356     using decomp by (simp add: field_simps)
   357   finally show ?case
   357   finally show ?case
   358     by simp
   358     by simp
   359 qed
   359 qed
   360 
   360 
   361 text \<open>Original version for the naturals.\<close>
   361 text \<open>Original version for the naturals.\<close>
   362 corollary binomial: "(a + b :: nat)^n = (\<Sum>k=0..n. (of_nat (n choose k)) * a^k * b^(n - k))"
   362 corollary binomial: "(a + b :: nat)^n = (\<Sum>k=0..n. (of_nat (n choose k)) * a^k * b^(n - k))"
   363   using binomial_ring [of "int a" "int b" n]
   363   using binomial_ring [of "int a" "int b" n]
   364   by (simp only: of_nat_add [symmetric] of_nat_mult [symmetric] of_nat_power [symmetric]
   364   by (simp only: of_nat_add [symmetric] of_nat_mult [symmetric] of_nat_power [symmetric]
   365       of_nat_setsum [symmetric] of_nat_eq_iff of_nat_id)
   365       of_nat_sum [symmetric] of_nat_eq_iff of_nat_id)
   366 
   366 
   367 lemma binomial_fact_lemma: "k \<le> n \<Longrightarrow> fact k * fact (n - k) * (n choose k) = fact n"
   367 lemma binomial_fact_lemma: "k \<le> n \<Longrightarrow> fact k * fact (n - k) * (n choose k) = fact n"
   368 proof (induct n arbitrary: k rule: nat_less_induct)
   368 proof (induct n arbitrary: k rule: nat_less_induct)
   369   fix n k
   369   fix n k
   370   assume H: "\<forall>m<n. \<forall>x\<le>m. fact x * fact (m - x) * (m choose x) = fact m"
   370   assume H: "\<forall>m<n. \<forall>x\<le>m. fact x * fact (m - x) * (m choose x) = fact m"
   457   assumes "n > 0"
   457   assumes "n > 0"
   458   shows "2 * (\<Sum>i\<le>n. if even i then of_nat (n choose i) else 0) = (2 ^ n :: 'a::comm_ring_1)"
   458   shows "2 * (\<Sum>i\<le>n. if even i then of_nat (n choose i) else 0) = (2 ^ n :: 'a::comm_ring_1)"
   459 proof -
   459 proof -
   460   have "2 ^ n = (\<Sum>i\<le>n. of_nat (n choose i)) + (\<Sum>i\<le>n. (-1) ^ i * of_nat (n choose i) :: 'a)"
   460   have "2 ^ n = (\<Sum>i\<le>n. of_nat (n choose i)) + (\<Sum>i\<le>n. (-1) ^ i * of_nat (n choose i) :: 'a)"
   461     using choose_row_sum[of n]
   461     using choose_row_sum[of n]
   462     by (simp add: choose_alternating_sum assms atLeast0AtMost of_nat_setsum[symmetric])
   462     by (simp add: choose_alternating_sum assms atLeast0AtMost of_nat_sum[symmetric])
   463   also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) + (-1) ^ i * of_nat (n choose i))"
   463   also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) + (-1) ^ i * of_nat (n choose i))"
   464     by (simp add: setsum.distrib)
   464     by (simp add: sum.distrib)
   465   also have "\<dots> = 2 * (\<Sum>i\<le>n. if even i then of_nat (n choose i) else 0)"
   465   also have "\<dots> = 2 * (\<Sum>i\<le>n. if even i then of_nat (n choose i) else 0)"
   466     by (subst setsum_distrib_left, intro setsum.cong) simp_all
   466     by (subst sum_distrib_left, intro sum.cong) simp_all
   467   finally show ?thesis ..
   467   finally show ?thesis ..
   468 qed
   468 qed
   469 
   469 
   470 lemma choose_odd_sum:
   470 lemma choose_odd_sum:
   471   assumes "n > 0"
   471   assumes "n > 0"
   472   shows "2 * (\<Sum>i\<le>n. if odd i then of_nat (n choose i) else 0) = (2 ^ n :: 'a::comm_ring_1)"
   472   shows "2 * (\<Sum>i\<le>n. if odd i then of_nat (n choose i) else 0) = (2 ^ n :: 'a::comm_ring_1)"
   473 proof -
   473 proof -
   474   have "2 ^ n = (\<Sum>i\<le>n. of_nat (n choose i)) - (\<Sum>i\<le>n. (-1) ^ i * of_nat (n choose i) :: 'a)"
   474   have "2 ^ n = (\<Sum>i\<le>n. of_nat (n choose i)) - (\<Sum>i\<le>n. (-1) ^ i * of_nat (n choose i) :: 'a)"
   475     using choose_row_sum[of n]
   475     using choose_row_sum[of n]
   476     by (simp add: choose_alternating_sum assms atLeast0AtMost of_nat_setsum[symmetric])
   476     by (simp add: choose_alternating_sum assms atLeast0AtMost of_nat_sum[symmetric])
   477   also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) - (-1) ^ i * of_nat (n choose i))"
   477   also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) - (-1) ^ i * of_nat (n choose i))"
   478     by (simp add: setsum_subtractf)
   478     by (simp add: sum_subtractf)
   479   also have "\<dots> = 2 * (\<Sum>i\<le>n. if odd i then of_nat (n choose i) else 0)"
   479   also have "\<dots> = 2 * (\<Sum>i\<le>n. if odd i then of_nat (n choose i) else 0)"
   480     by (subst setsum_distrib_left, intro setsum.cong) simp_all
   480     by (subst sum_distrib_left, intro sum.cong) simp_all
   481   finally show ?thesis ..
   481   finally show ?thesis ..
   482 qed
   482 qed
   483 
   483 
   484 lemma choose_row_sum': "(\<Sum>k\<le>n. (n choose k)) = 2 ^ n"
   484 lemma choose_row_sum': "(\<Sum>k\<le>n. (n choose k)) = 2 ^ n"
   485   using choose_row_sum[of n] by (simp add: atLeast0AtMost)
   485   using choose_row_sum[of n] by (simp add: atLeast0AtMost)
   488 lemma sum_choose_diagonal:
   488 lemma sum_choose_diagonal:
   489   assumes "m \<le> n"
   489   assumes "m \<le> n"
   490   shows "(\<Sum>k=0..m. (n - k) choose (m - k)) = Suc n choose m"
   490   shows "(\<Sum>k=0..m. (n - k) choose (m - k)) = Suc n choose m"
   491 proof -
   491 proof -
   492   have "(\<Sum>k=0..m. (n-k) choose (m - k)) = (\<Sum>k=0..m. (n - m + k) choose k)"
   492   have "(\<Sum>k=0..m. (n-k) choose (m - k)) = (\<Sum>k=0..m. (n - m + k) choose k)"
   493     using setsum.atLeast_atMost_rev [of "\<lambda>k. (n - k) choose (m - k)" 0 m] assms
   493     using sum.atLeast_atMost_rev [of "\<lambda>k. (n - k) choose (m - k)" 0 m] assms
   494       by simp
   494       by simp
   495   also have "\<dots> = Suc (n - m + m) choose m"
   495   also have "\<dots> = Suc (n - m + m) choose m"
   496     by (rule sum_choose_lower)
   496     by (rule sum_choose_lower)
   497   also have "\<dots> = Suc n choose m"
   497   also have "\<dots> = Suc n choose m"
   498     using assms by simp
   498     using assms by simp
   912 next
   912 next
   913   case (Suc m)
   913   case (Suc m)
   914   have "(\<Sum>i\<le>n. i * (n choose i)) = (\<Sum>i\<le>Suc m. i * (Suc m choose i))"
   914   have "(\<Sum>i\<le>n. i * (n choose i)) = (\<Sum>i\<le>Suc m. i * (Suc m choose i))"
   915     by (simp add: Suc)
   915     by (simp add: Suc)
   916   also have "\<dots> = Suc m * 2 ^ m"
   916   also have "\<dots> = Suc m * 2 ^ m"
   917     by (simp only: setsum_atMost_Suc_shift Suc_times_binomial setsum_distrib_left[symmetric])
   917     by (simp only: sum_atMost_Suc_shift Suc_times_binomial sum_distrib_left[symmetric])
   918        (simp add: choose_row_sum')
   918        (simp add: choose_row_sum')
   919   finally show ?thesis
   919   finally show ?thesis
   920     using Suc by simp
   920     using Suc by simp
   921 qed
   921 qed
   922 
   922 
   932     by simp
   932     by simp
   933   have "(\<Sum>i\<le>n. (-1) ^ i * of_nat i * of_nat (n choose i) :: 'a) =
   933   have "(\<Sum>i\<le>n. (-1) ^ i * of_nat i * of_nat (n choose i) :: 'a) =
   934       (\<Sum>i\<le>Suc m. (-1) ^ i * of_nat i * of_nat (Suc m choose i))"
   934       (\<Sum>i\<le>Suc m. (-1) ^ i * of_nat i * of_nat (Suc m choose i))"
   935     by (simp add: Suc)
   935     by (simp add: Suc)
   936   also have "\<dots> = (\<Sum>i\<le>m. (-1) ^ (Suc i) * of_nat (Suc i * (Suc m choose Suc i)))"
   936   also have "\<dots> = (\<Sum>i\<le>m. (-1) ^ (Suc i) * of_nat (Suc i * (Suc m choose Suc i)))"
   937     by (simp only: setsum_atMost_Suc_shift setsum_distrib_left[symmetric] mult_ac of_nat_mult) simp
   937     by (simp only: sum_atMost_Suc_shift sum_distrib_left[symmetric] mult_ac of_nat_mult) simp
   938   also have "\<dots> = - of_nat (Suc m) * (\<Sum>i\<le>m. (-1) ^ i * of_nat (m choose i))"
   938   also have "\<dots> = - of_nat (Suc m) * (\<Sum>i\<le>m. (-1) ^ i * of_nat (m choose i))"
   939     by (subst setsum_distrib_left, rule setsum.cong[OF refl], subst Suc_times_binomial)
   939     by (subst sum_distrib_left, rule sum.cong[OF refl], subst Suc_times_binomial)
   940        (simp add: algebra_simps)
   940        (simp add: algebra_simps)
   941   also have "(\<Sum>i\<le>m. (-1 :: 'a) ^ i * of_nat ((m choose i))) = 0"
   941   also have "(\<Sum>i\<le>m. (-1 :: 'a) ^ i * of_nat ((m choose i))) = 0"
   942     using choose_alternating_sum[OF \<open>m > 0\<close>] by simp
   942     using choose_alternating_sum[OF \<open>m > 0\<close>] by simp
   943   finally show ?thesis
   943   finally show ?thesis
   944     by simp
   944     by simp
   946 
   946 
   947 lemma vandermonde: "(\<Sum>k\<le>r. (m choose k) * (n choose (r - k))) = (m + n) choose r"
   947 lemma vandermonde: "(\<Sum>k\<le>r. (m choose k) * (n choose (r - k))) = (m + n) choose r"
   948 proof (induct n arbitrary: r)
   948 proof (induct n arbitrary: r)
   949   case 0
   949   case 0
   950   have "(\<Sum>k\<le>r. (m choose k) * (0 choose (r - k))) = (\<Sum>k\<le>r. if k = r then (m choose k) else 0)"
   950   have "(\<Sum>k\<le>r. (m choose k) * (0 choose (r - k))) = (\<Sum>k\<le>r. if k = r then (m choose k) else 0)"
   951     by (intro setsum.cong) simp_all
   951     by (intro sum.cong) simp_all
   952   also have "\<dots> = m choose r"
   952   also have "\<dots> = m choose r"
   953     by (simp add: setsum.delta)
   953     by (simp add: sum.delta)
   954   finally show ?case
   954   finally show ?case
   955     by simp
   955     by simp
   956 next
   956 next
   957   case (Suc n r)
   957   case (Suc n r)
   958   show ?case
   958   show ?case
   959     by (cases r) (simp_all add: Suc [symmetric] algebra_simps setsum.distrib Suc_diff_le)
   959     by (cases r) (simp_all add: Suc [symmetric] algebra_simps sum.distrib Suc_diff_le)
   960 qed
   960 qed
   961 
   961 
   962 lemma choose_square_sum: "(\<Sum>k\<le>n. (n choose k)^2) = ((2*n) choose n)"
   962 lemma choose_square_sum: "(\<Sum>k\<le>n. (n choose k)^2) = ((2*n) choose n)"
   963   using vandermonde[of n n n]
   963   using vandermonde[of n n n]
   964   by (simp add: power2_eq_square mult_2 binomial_symmetric [symmetric])
   964   by (simp add: power2_eq_square mult_2 binomial_symmetric [symmetric])
   973   case (Suc n a b)
   973   case (Suc n a b)
   974   have "(\<Sum>k\<le>Suc n. of_nat (Suc n choose k) * pochhammer a k * pochhammer b (Suc n - k)) =
   974   have "(\<Sum>k\<le>Suc n. of_nat (Suc n choose k) * pochhammer a k * pochhammer b (Suc n - k)) =
   975       (\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a (Suc i) * pochhammer b (n - i)) +
   975       (\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a (Suc i) * pochhammer b (n - i)) +
   976       ((\<Sum>i\<le>n. of_nat (n choose Suc i) * pochhammer a (Suc i) * pochhammer b (n - i)) +
   976       ((\<Sum>i\<le>n. of_nat (n choose Suc i) * pochhammer a (Suc i) * pochhammer b (n - i)) +
   977       pochhammer b (Suc n))"
   977       pochhammer b (Suc n))"
   978     by (subst setsum_atMost_Suc_shift) (simp add: ring_distribs setsum.distrib)
   978     by (subst sum_atMost_Suc_shift) (simp add: ring_distribs sum.distrib)
   979   also have "(\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a (Suc i) * pochhammer b (n - i)) =
   979   also have "(\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a (Suc i) * pochhammer b (n - i)) =
   980       a * pochhammer ((a + 1) + b) n"
   980       a * pochhammer ((a + 1) + b) n"
   981     by (subst Suc) (simp add: setsum_distrib_left pochhammer_rec mult_ac)
   981     by (subst Suc) (simp add: sum_distrib_left pochhammer_rec mult_ac)
   982   also have "(\<Sum>i\<le>n. of_nat (n choose Suc i) * pochhammer a (Suc i) * pochhammer b (n - i)) +
   982   also have "(\<Sum>i\<le>n. of_nat (n choose Suc i) * pochhammer a (Suc i) * pochhammer b (n - i)) +
   983         pochhammer b (Suc n) =
   983         pochhammer b (Suc n) =
   984       (\<Sum>i=0..Suc n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc n - i))"
   984       (\<Sum>i=0..Suc n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc n - i))"
   985     apply (subst setsum_head_Suc)
   985     apply (subst sum_head_Suc)
   986     apply simp
   986     apply simp
   987     apply (subst setsum_shift_bounds_cl_Suc_ivl)
   987     apply (subst sum_shift_bounds_cl_Suc_ivl)
   988     apply (simp add: atLeast0AtMost)
   988     apply (simp add: atLeast0AtMost)
   989     done
   989     done
   990   also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc n - i))"
   990   also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc n - i))"
   991     using Suc by (intro setsum.mono_neutral_right) (auto simp: not_le binomial_eq_0)
   991     using Suc by (intro sum.mono_neutral_right) (auto simp: not_le binomial_eq_0)
   992   also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc (n - i)))"
   992   also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) * pochhammer a i * pochhammer b (Suc (n - i)))"
   993     by (intro setsum.cong) (simp_all add: Suc_diff_le)
   993     by (intro sum.cong) (simp_all add: Suc_diff_le)
   994   also have "\<dots> = b * pochhammer (a + (b + 1)) n"
   994   also have "\<dots> = b * pochhammer (a + (b + 1)) n"
   995     by (subst Suc) (simp add: setsum_distrib_left mult_ac pochhammer_rec)
   995     by (subst Suc) (simp add: sum_distrib_left mult_ac pochhammer_rec)
   996   also have "a * pochhammer ((a + 1) + b) n + b * pochhammer (a + (b + 1)) n =
   996   also have "a * pochhammer ((a + 1) + b) n + b * pochhammer (a + (b + 1)) n =
   997       pochhammer (a + b) (Suc n)"
   997       pochhammer (a + b) (Suc n)"
   998     by (simp add: pochhammer_rec algebra_simps)
   998     by (simp add: pochhammer_rec algebra_simps)
   999   finally show ?case ..
   999   finally show ?case ..
  1000 qed
  1000 qed
  1191 
  1191 
  1192 lemma gbinomial_sum_lower_neg: "(\<Sum>k\<le>m. (r gchoose k) * (- 1) ^ k) = (- 1) ^ m * (r - 1 gchoose m)"
  1192 lemma gbinomial_sum_lower_neg: "(\<Sum>k\<le>m. (r gchoose k) * (- 1) ^ k) = (- 1) ^ m * (r - 1 gchoose m)"
  1193   (is "?lhs = ?rhs")
  1193   (is "?lhs = ?rhs")
  1194 proof -
  1194 proof -
  1195   have "?lhs = (\<Sum>k\<le>m. -(r + 1) + of_nat k gchoose k)"
  1195   have "?lhs = (\<Sum>k\<le>m. -(r + 1) + of_nat k gchoose k)"
  1196     by (intro setsum.cong[OF refl]) (subst gbinomial_negated_upper, simp add: power_mult_distrib)
  1196     by (intro sum.cong[OF refl]) (subst gbinomial_negated_upper, simp add: power_mult_distrib)
  1197   also have "\<dots>  = - r + of_nat m gchoose m"
  1197   also have "\<dots>  = - r + of_nat m gchoose m"
  1198     by (subst gbinomial_parallel_sum) simp
  1198     by (subst gbinomial_parallel_sum) simp
  1199   also have "\<dots> = ?rhs"
  1199   also have "\<dots> = ?rhs"
  1200     by (subst gbinomial_negated_upper) (simp add: power_mult_distrib)
  1200     by (subst gbinomial_negated_upper) (simp add: power_mult_distrib)
  1201   finally show ?thesis .
  1201   finally show ?thesis .
  1216   also have "\<dots> = (of_nat (Suc mm) + 1) / 2 * (r gchoose (Suc mm + 1))"
  1216   also have "\<dots> = (of_nat (Suc mm) + 1) / 2 * (r gchoose (Suc mm + 1))"
  1217     by (subst gbinomial_absorption [symmetric]) simp
  1217     by (subst gbinomial_absorption [symmetric]) simp
  1218   finally show ?case .
  1218   finally show ?case .
  1219 qed
  1219 qed
  1220 
  1220 
  1221 lemma setsum_bounds_lt_plus1: "(\<Sum>k<mm. f (Suc k)) = (\<Sum>k=1..mm. f k)"
  1221 lemma sum_bounds_lt_plus1: "(\<Sum>k<mm. f (Suc k)) = (\<Sum>k=1..mm. f k)"
  1222   by (induct mm) simp_all
  1222   by (induct mm) simp_all
  1223 
  1223 
  1224 lemma gbinomial_partial_sum_poly:
  1224 lemma gbinomial_partial_sum_poly:
  1225   "(\<Sum>k\<le>m. (of_nat m + r gchoose k) * x^k * y^(m-k)) =
  1225   "(\<Sum>k\<le>m. (of_nat m + r gchoose k) * x^k * y^(m-k)) =
  1226     (\<Sum>k\<le>m. (-r gchoose k) * (-x)^k * (x + y)^(m-k))"
  1226     (\<Sum>k\<le>m. (-r gchoose k) * (-x)^k * (x + y)^(m-k))"
  1234   define S where "S = ?lhs"
  1234   define S where "S = ?lhs"
  1235   have SG_def: "S = (\<lambda>i. (\<Sum>k\<le>i. (G i k)))"
  1235   have SG_def: "S = (\<lambda>i. (\<Sum>k\<le>i. (G i k)))"
  1236     unfolding S_def G_def ..
  1236     unfolding S_def G_def ..
  1237 
  1237 
  1238   have "S (Suc mm) = G (Suc mm) 0 + (\<Sum>k=Suc 0..Suc mm. G (Suc mm) k)"
  1238   have "S (Suc mm) = G (Suc mm) 0 + (\<Sum>k=Suc 0..Suc mm. G (Suc mm) k)"
  1239     using SG_def by (simp add: setsum_head_Suc atLeast0AtMost [symmetric])
  1239     using SG_def by (simp add: sum_head_Suc atLeast0AtMost [symmetric])
  1240   also have "(\<Sum>k=Suc 0..Suc mm. G (Suc mm) k) = (\<Sum>k=0..mm. G (Suc mm) (Suc k))"
  1240   also have "(\<Sum>k=Suc 0..Suc mm. G (Suc mm) k) = (\<Sum>k=0..mm. G (Suc mm) (Suc k))"
  1241     by (subst setsum_shift_bounds_cl_Suc_ivl) simp
  1241     by (subst sum_shift_bounds_cl_Suc_ivl) simp
  1242   also have "\<dots> = (\<Sum>k=0..mm. ((of_nat mm + r gchoose (Suc k)) +
  1242   also have "\<dots> = (\<Sum>k=0..mm. ((of_nat mm + r gchoose (Suc k)) +
  1243       (of_nat mm + r gchoose k)) * x^(Suc k) * y^(mm - k))"
  1243       (of_nat mm + r gchoose k)) * x^(Suc k) * y^(mm - k))"
  1244     unfolding G_def by (subst gbinomial_addition_formula) simp
  1244     unfolding G_def by (subst gbinomial_addition_formula) simp
  1245   also have "\<dots> = (\<Sum>k=0..mm. (of_nat mm + r gchoose (Suc k)) * x^(Suc k) * y^(mm - k)) +
  1245   also have "\<dots> = (\<Sum>k=0..mm. (of_nat mm + r gchoose (Suc k)) * x^(Suc k) * y^(mm - k)) +
  1246       (\<Sum>k=0..mm. (of_nat mm + r gchoose k) * x^(Suc k) * y^(mm - k))"
  1246       (\<Sum>k=0..mm. (of_nat mm + r gchoose k) * x^(Suc k) * y^(mm - k))"
  1247     by (subst setsum.distrib [symmetric]) (simp add: algebra_simps)
  1247     by (subst sum.distrib [symmetric]) (simp add: algebra_simps)
  1248   also have "(\<Sum>k=0..mm. (of_nat mm + r gchoose (Suc k)) * x^(Suc k) * y^(mm - k)) =
  1248   also have "(\<Sum>k=0..mm. (of_nat mm + r gchoose (Suc k)) * x^(Suc k) * y^(mm - k)) =
  1249       (\<Sum>k<Suc mm. (of_nat mm + r gchoose (Suc k)) * x^(Suc k) * y^(mm - k))"
  1249       (\<Sum>k<Suc mm. (of_nat mm + r gchoose (Suc k)) * x^(Suc k) * y^(mm - k))"
  1250     by (simp only: atLeast0AtMost lessThan_Suc_atMost)
  1250     by (simp only: atLeast0AtMost lessThan_Suc_atMost)
  1251   also have "\<dots> = (\<Sum>k<mm. (of_nat mm + r gchoose Suc k) * x^(Suc k) * y^(mm-k)) +
  1251   also have "\<dots> = (\<Sum>k<mm. (of_nat mm + r gchoose Suc k) * x^(Suc k) * y^(mm-k)) +
  1252       (of_nat mm + r gchoose (Suc mm)) * x^(Suc mm)"
  1252       (of_nat mm + r gchoose (Suc mm)) * x^(Suc mm)"
  1253     (is "_ = ?A + ?B")
  1253     (is "_ = ?A + ?B")
  1254     by (subst setsum_lessThan_Suc) simp
  1254     by (subst sum_lessThan_Suc) simp
  1255   also have "?A = (\<Sum>k=1..mm. (of_nat mm + r gchoose k) * x^k * y^(mm - k + 1))"
  1255   also have "?A = (\<Sum>k=1..mm. (of_nat mm + r gchoose k) * x^k * y^(mm - k + 1))"
  1256   proof (subst setsum_bounds_lt_plus1 [symmetric], intro setsum.cong[OF refl], clarify)
  1256   proof (subst sum_bounds_lt_plus1 [symmetric], intro sum.cong[OF refl], clarify)
  1257     fix k
  1257     fix k
  1258     assume "k < mm"
  1258     assume "k < mm"
  1259     then have "mm - k = mm - Suc k + 1"
  1259     then have "mm - k = mm - Suc k + 1"
  1260       by linarith
  1260       by linarith
  1261     then show "(of_nat mm + r gchoose Suc k) * x ^ Suc k * y ^ (mm - k) =
  1261     then show "(of_nat mm + r gchoose Suc k) * x ^ Suc k * y ^ (mm - k) =
  1262         (of_nat mm + r gchoose Suc k) * x ^ Suc k * y ^ (mm - Suc k + 1)"
  1262         (of_nat mm + r gchoose Suc k) * x ^ Suc k * y ^ (mm - Suc k + 1)"
  1263       by (simp only:)
  1263       by (simp only:)
  1264   qed
  1264   qed
  1265   also have "\<dots> + ?B = y * (\<Sum>k=1..mm. (G mm k)) + (of_nat mm + r gchoose (Suc mm)) * x^(Suc mm)"
  1265   also have "\<dots> + ?B = y * (\<Sum>k=1..mm. (G mm k)) + (of_nat mm + r gchoose (Suc mm)) * x^(Suc mm)"
  1266     unfolding G_def by (subst setsum_distrib_left) (simp add: algebra_simps)
  1266     unfolding G_def by (subst sum_distrib_left) (simp add: algebra_simps)
  1267   also have "(\<Sum>k=0..mm. (of_nat mm + r gchoose k) * x^(Suc k) * y^(mm - k)) = x * (S mm)"
  1267   also have "(\<Sum>k=0..mm. (of_nat mm + r gchoose k) * x^(Suc k) * y^(mm - k)) = x * (S mm)"
  1268     unfolding S_def by (subst setsum_distrib_left) (simp add: atLeast0AtMost algebra_simps)
  1268     unfolding S_def by (subst sum_distrib_left) (simp add: atLeast0AtMost algebra_simps)
  1269   also have "(G (Suc mm) 0) = y * (G mm 0)"
  1269   also have "(G (Suc mm) 0) = y * (G mm 0)"
  1270     by (simp add: G_def)
  1270     by (simp add: G_def)
  1271   finally have "S (Suc mm) =
  1271   finally have "S (Suc mm) =
  1272       y * (G mm 0 + (\<Sum>k=1..mm. (G mm k))) + (of_nat mm + r gchoose (Suc mm)) * x^(Suc mm) + x * (S mm)"
  1272       y * (G mm 0 + (\<Sum>k=1..mm. (G mm k))) + (of_nat mm + r gchoose (Suc mm)) * x^(Suc mm) + x * (S mm)"
  1273     by (simp add: ring_distribs)
  1273     by (simp add: ring_distribs)
  1274   also have "G mm 0 + (\<Sum>k=1..mm. (G mm k)) = S mm"
  1274   also have "G mm 0 + (\<Sum>k=1..mm. (G mm k)) = S mm"
  1275     by (simp add: setsum_head_Suc[symmetric] SG_def atLeast0AtMost)
  1275     by (simp add: sum_head_Suc[symmetric] SG_def atLeast0AtMost)
  1276   finally have "S (Suc mm) = (x + y) * (S mm) + (of_nat mm + r gchoose (Suc mm)) * x^(Suc mm)"
  1276   finally have "S (Suc mm) = (x + y) * (S mm) + (of_nat mm + r gchoose (Suc mm)) * x^(Suc mm)"
  1277     by (simp add: algebra_simps)
  1277     by (simp add: algebra_simps)
  1278   also have "(of_nat mm + r gchoose (Suc mm)) = (-1) ^ (Suc mm) * (- r gchoose (Suc mm))"
  1278   also have "(of_nat mm + r gchoose (Suc mm)) = (-1) ^ (Suc mm) * (- r gchoose (Suc mm))"
  1279     by (subst gbinomial_negated_upper) simp
  1279     by (subst gbinomial_negated_upper) simp
  1280   also have "(-1) ^ Suc mm * (- r gchoose Suc mm) * x ^ Suc mm =
  1280   also have "(-1) ^ Suc mm * (- r gchoose Suc mm) * x ^ Suc mm =
  1281       (- r gchoose (Suc mm)) * (-x) ^ Suc mm"
  1281       (- r gchoose (Suc mm)) * (-x) ^ Suc mm"
  1282     by (simp add: power_minus[of x])
  1282     by (simp add: power_minus[of x])
  1283   also have "(x + y) * S mm + \<dots> = (x + y) * ?rhs mm + (- r gchoose (Suc mm)) * (- x)^Suc mm"
  1283   also have "(x + y) * S mm + \<dots> = (x + y) * ?rhs mm + (- r gchoose (Suc mm)) * (- x)^Suc mm"
  1284     unfolding S_def by (subst Suc.IH) simp
  1284     unfolding S_def by (subst Suc.IH) simp
  1285   also have "(x + y) * ?rhs mm = (\<Sum>n\<le>mm. ((- r gchoose n) * (- x) ^ n * (x + y) ^ (Suc mm - n)))"
  1285   also have "(x + y) * ?rhs mm = (\<Sum>n\<le>mm. ((- r gchoose n) * (- x) ^ n * (x + y) ^ (Suc mm - n)))"
  1286     by (subst setsum_distrib_left, rule setsum.cong) (simp_all add: Suc_diff_le)
  1286     by (subst sum_distrib_left, rule sum.cong) (simp_all add: Suc_diff_le)
  1287   also have "\<dots> + (-r gchoose (Suc mm)) * (-x)^Suc mm =
  1287   also have "\<dots> + (-r gchoose (Suc mm)) * (-x)^Suc mm =
  1288       (\<Sum>n\<le>Suc mm. (- r gchoose n) * (- x) ^ n * (x + y) ^ (Suc mm - n))"
  1288       (\<Sum>n\<le>Suc mm. (- r gchoose n) * (- x) ^ n * (x + y) ^ (Suc mm - n))"
  1289     by simp
  1289     by simp
  1290   finally show ?case
  1290   finally show ?case
  1291     by (simp only: S_def)
  1291     by (simp only: S_def)
  1294 lemma gbinomial_partial_sum_poly_xpos:
  1294 lemma gbinomial_partial_sum_poly_xpos:
  1295   "(\<Sum>k\<le>m. (of_nat m + r gchoose k) * x^k * y^(m-k)) =
  1295   "(\<Sum>k\<le>m. (of_nat m + r gchoose k) * x^k * y^(m-k)) =
  1296      (\<Sum>k\<le>m. (of_nat k + r - 1 gchoose k) * x^k * (x + y)^(m-k))"
  1296      (\<Sum>k\<le>m. (of_nat k + r - 1 gchoose k) * x^k * (x + y)^(m-k))"
  1297   apply (subst gbinomial_partial_sum_poly)
  1297   apply (subst gbinomial_partial_sum_poly)
  1298   apply (subst gbinomial_negated_upper)
  1298   apply (subst gbinomial_negated_upper)
  1299   apply (intro setsum.cong, rule refl)
  1299   apply (intro sum.cong, rule refl)
  1300   apply (simp add: power_mult_distrib [symmetric])
  1300   apply (simp add: power_mult_distrib [symmetric])
  1301   done
  1301   done
  1302 
  1302 
  1303 lemma binomial_r_part_sum: "(\<Sum>k\<le>m. (2 * m + 1 choose k)) = 2 ^ (2 * m)"
  1303 lemma binomial_r_part_sum: "(\<Sum>k\<le>m. (2 * m + 1 choose k)) = 2 ^ (2 * m)"
  1304 proof -
  1304 proof -
  1305   have "2 * 2^(2*m) = (\<Sum>k = 0..(2 * m + 1). (2 * m + 1 choose k))"
  1305   have "2 * 2^(2*m) = (\<Sum>k = 0..(2 * m + 1). (2 * m + 1 choose k))"
  1306     using choose_row_sum[where n="2 * m + 1"] by simp
  1306     using choose_row_sum[where n="2 * m + 1"] by simp
  1307   also have "(\<Sum>k = 0..(2 * m + 1). (2 * m + 1 choose k)) =
  1307   also have "(\<Sum>k = 0..(2 * m + 1). (2 * m + 1 choose k)) =
  1308       (\<Sum>k = 0..m. (2 * m + 1 choose k)) +
  1308       (\<Sum>k = 0..m. (2 * m + 1 choose k)) +
  1309       (\<Sum>k = m+1..2*m+1. (2 * m + 1 choose k))"
  1309       (\<Sum>k = m+1..2*m+1. (2 * m + 1 choose k))"
  1310     using setsum_ub_add_nat[of 0 m "\<lambda>k. 2 * m + 1 choose k" "m+1"]
  1310     using sum_ub_add_nat[of 0 m "\<lambda>k. 2 * m + 1 choose k" "m+1"]
  1311     by (simp add: mult_2)
  1311     by (simp add: mult_2)
  1312   also have "(\<Sum>k = m+1..2*m+1. (2 * m + 1 choose k)) =
  1312   also have "(\<Sum>k = m+1..2*m+1. (2 * m + 1 choose k)) =
  1313       (\<Sum>k = 0..m. (2 * m + 1 choose (k + (m + 1))))"
  1313       (\<Sum>k = 0..m. (2 * m + 1 choose (k + (m + 1))))"
  1314     by (subst setsum_shift_bounds_cl_nat_ivl [symmetric]) (simp add: mult_2)
  1314     by (subst sum_shift_bounds_cl_nat_ivl [symmetric]) (simp add: mult_2)
  1315   also have "\<dots> = (\<Sum>k = 0..m. (2 * m + 1 choose (m - k)))"
  1315   also have "\<dots> = (\<Sum>k = 0..m. (2 * m + 1 choose (m - k)))"
  1316     by (intro setsum.cong[OF refl], subst binomial_symmetric) simp_all
  1316     by (intro sum.cong[OF refl], subst binomial_symmetric) simp_all
  1317   also have "\<dots> = (\<Sum>k = 0..m. (2 * m + 1 choose k))"
  1317   also have "\<dots> = (\<Sum>k = 0..m. (2 * m + 1 choose k))"
  1318     using setsum.atLeast_atMost_rev [of "\<lambda>k. 2 * m + 1 choose (m - k)" 0 m]
  1318     using sum.atLeast_atMost_rev [of "\<lambda>k. 2 * m + 1 choose (m - k)" 0 m]
  1319     by simp
  1319     by simp
  1320   also have "\<dots> + \<dots> = 2 * \<dots>"
  1320   also have "\<dots> + \<dots> = 2 * \<dots>"
  1321     by simp
  1321     by simp
  1322   finally show ?thesis
  1322   finally show ?thesis
  1323     by (subst (asm) mult_cancel1) (simp add: atLeast0AtMost)
  1323     by (subst (asm) mult_cancel1) (simp add: atLeast0AtMost)
  1343     using gbinomial_r_part_sum ..
  1343     using gbinomial_r_part_sum ..
  1344   also have "\<dots> = (\<Sum>k\<le>m. (of_nat (m + k) gchoose k) * 2 ^ (m - k))"
  1344   also have "\<dots> = (\<Sum>k\<le>m. (of_nat (m + k) gchoose k) * 2 ^ (m - k))"
  1345     using gbinomial_partial_sum_poly_xpos[where x="1" and y="1" and r="of_nat m + 1" and m="m"]
  1345     using gbinomial_partial_sum_poly_xpos[where x="1" and y="1" and r="of_nat m + 1" and m="m"]
  1346     by (simp add: add_ac)
  1346     by (simp add: add_ac)
  1347   also have "\<dots> = 2 ^ m * (\<Sum>k\<le>m. (of_nat (m + k) gchoose k) / 2 ^ k)"
  1347   also have "\<dots> = 2 ^ m * (\<Sum>k\<le>m. (of_nat (m + k) gchoose k) / 2 ^ k)"
  1348     by (subst setsum_distrib_left) (simp add: algebra_simps power_diff)
  1348     by (subst sum_distrib_left) (simp add: algebra_simps power_diff)
  1349   finally show ?thesis
  1349   finally show ?thesis
  1350     by (subst (asm) mult_left_cancel) simp_all
  1350     by (subst (asm) mult_left_cancel) simp_all
  1351 qed
  1351 qed
  1352 
  1352 
  1353 lemma gbinomial_trinomial_revision:
  1353 lemma gbinomial_trinomial_revision:
  1442 proof -
  1442 proof -
  1443   have "?rhs = nat (\<Sum>I | I \<subseteq> A \<and> I \<noteq> {}. (- 1) ^ (card I + 1) * (\<Sum>_\<in>\<Inter>I. 1))"
  1443   have "?rhs = nat (\<Sum>I | I \<subseteq> A \<and> I \<noteq> {}. (- 1) ^ (card I + 1) * (\<Sum>_\<in>\<Inter>I. 1))"
  1444     by simp
  1444     by simp
  1445   also have "\<dots> = nat (\<Sum>I | I \<subseteq> A \<and> I \<noteq> {}. (\<Sum>_\<in>\<Inter>I. (- 1) ^ (card I + 1)))"
  1445   also have "\<dots> = nat (\<Sum>I | I \<subseteq> A \<and> I \<noteq> {}. (\<Sum>_\<in>\<Inter>I. (- 1) ^ (card I + 1)))"
  1446     (is "_ = nat ?rhs")
  1446     (is "_ = nat ?rhs")
  1447     by (subst setsum_distrib_left) simp
  1447     by (subst sum_distrib_left) simp
  1448   also have "?rhs = (\<Sum>(I, _)\<in>Sigma {I. I \<subseteq> A \<and> I \<noteq> {}} Inter. (- 1) ^ (card I + 1))"
  1448   also have "?rhs = (\<Sum>(I, _)\<in>Sigma {I. I \<subseteq> A \<and> I \<noteq> {}} Inter. (- 1) ^ (card I + 1))"
  1449     using assms by (subst setsum.Sigma) auto
  1449     using assms by (subst sum.Sigma) auto
  1450   also have "\<dots> = (\<Sum>(x, I)\<in>(SIGMA x:UNIV. {I. I \<subseteq> A \<and> I \<noteq> {} \<and> x \<in> \<Inter>I}). (- 1) ^ (card I + 1))"
  1450   also have "\<dots> = (\<Sum>(x, I)\<in>(SIGMA x:UNIV. {I. I \<subseteq> A \<and> I \<noteq> {} \<and> x \<in> \<Inter>I}). (- 1) ^ (card I + 1))"
  1451     by (rule setsum.reindex_cong [where l = "\<lambda>(x, y). (y, x)"]) (auto intro: inj_onI simp add: split_beta)
  1451     by (rule sum.reindex_cong [where l = "\<lambda>(x, y). (y, x)"]) (auto intro: inj_onI simp add: split_beta)
  1452   also have "\<dots> = (\<Sum>(x, I)\<in>(SIGMA x:\<Union>A. {I. I \<subseteq> A \<and> I \<noteq> {} \<and> x \<in> \<Inter>I}). (- 1) ^ (card I + 1))"
  1452   also have "\<dots> = (\<Sum>(x, I)\<in>(SIGMA x:\<Union>A. {I. I \<subseteq> A \<and> I \<noteq> {} \<and> x \<in> \<Inter>I}). (- 1) ^ (card I + 1))"
  1453     using assms
  1453     using assms
  1454     by (auto intro!: setsum.mono_neutral_cong_right finite_SigmaI2 intro: finite_subset[where B="\<Union>A"])
  1454     by (auto intro!: sum.mono_neutral_cong_right finite_SigmaI2 intro: finite_subset[where B="\<Union>A"])
  1455   also have "\<dots> = (\<Sum>x\<in>\<Union>A. (\<Sum>I|I \<subseteq> A \<and> I \<noteq> {} \<and> x \<in> \<Inter>I. (- 1) ^ (card I + 1)))"
  1455   also have "\<dots> = (\<Sum>x\<in>\<Union>A. (\<Sum>I|I \<subseteq> A \<and> I \<noteq> {} \<and> x \<in> \<Inter>I. (- 1) ^ (card I + 1)))"
  1456     using assms by (subst setsum.Sigma) auto
  1456     using assms by (subst sum.Sigma) auto
  1457   also have "\<dots> = (\<Sum>_\<in>\<Union>A. 1)" (is "setsum ?lhs _ = _")
  1457   also have "\<dots> = (\<Sum>_\<in>\<Union>A. 1)" (is "sum ?lhs _ = _")
  1458   proof (rule setsum.cong[OF refl])
  1458   proof (rule sum.cong[OF refl])
  1459     fix x
  1459     fix x
  1460     assume x: "x \<in> \<Union>A"
  1460     assume x: "x \<in> \<Union>A"
  1461     define K where "K = {X \<in> A. x \<in> X}"
  1461     define K where "K = {X \<in> A. x \<in> X}"
  1462     with \<open>finite A\<close> have K: "finite K"
  1462     with \<open>finite A\<close> have K: "finite K"
  1463       by auto
  1463       by auto
  1468       using assms
  1468       using assms
  1469       by (auto intro!: rev_image_eqI[where x="(card a, a)" for a]
  1469       by (auto intro!: rev_image_eqI[where x="(card a, a)" for a]
  1470         simp add: card_gt_0_iff[folded Suc_le_eq]
  1470         simp add: card_gt_0_iff[folded Suc_le_eq]
  1471         dest: finite_subset intro: card_mono)
  1471         dest: finite_subset intro: card_mono)
  1472     ultimately have "?lhs x = (\<Sum>(i, I)\<in>(SIGMA i:{1..card A}. ?I i). (- 1) ^ (i + 1))"
  1472     ultimately have "?lhs x = (\<Sum>(i, I)\<in>(SIGMA i:{1..card A}. ?I i). (- 1) ^ (i + 1))"
  1473       by (rule setsum.reindex_cong [where l = snd]) fastforce
  1473       by (rule sum.reindex_cong [where l = snd]) fastforce
  1474     also have "\<dots> = (\<Sum>i=1..card A. (\<Sum>I|I \<subseteq> A \<and> card I = i \<and> x \<in> \<Inter>I. (- 1) ^ (i + 1)))"
  1474     also have "\<dots> = (\<Sum>i=1..card A. (\<Sum>I|I \<subseteq> A \<and> card I = i \<and> x \<in> \<Inter>I. (- 1) ^ (i + 1)))"
  1475       using assms by (subst setsum.Sigma) auto
  1475       using assms by (subst sum.Sigma) auto
  1476     also have "\<dots> = (\<Sum>i=1..card A. (- 1) ^ (i + 1) * (\<Sum>I|I \<subseteq> A \<and> card I = i \<and> x \<in> \<Inter>I. 1))"
  1476     also have "\<dots> = (\<Sum>i=1..card A. (- 1) ^ (i + 1) * (\<Sum>I|I \<subseteq> A \<and> card I = i \<and> x \<in> \<Inter>I. 1))"
  1477       by (subst setsum_distrib_left) simp
  1477       by (subst sum_distrib_left) simp
  1478     also have "\<dots> = (\<Sum>i=1..card K. (- 1) ^ (i + 1) * (\<Sum>I|I \<subseteq> K \<and> card I = i. 1))"
  1478     also have "\<dots> = (\<Sum>i=1..card K. (- 1) ^ (i + 1) * (\<Sum>I|I \<subseteq> K \<and> card I = i. 1))"
  1479       (is "_ = ?rhs")
  1479       (is "_ = ?rhs")
  1480     proof (rule setsum.mono_neutral_cong_right[rule_format])
  1480     proof (rule sum.mono_neutral_cong_right[rule_format])
  1481       show "finite {1..card A}"
  1481       show "finite {1..card A}"
  1482         by simp
  1482         by simp
  1483       show "{1..card K} \<subseteq> {1..card A}"
  1483       show "{1..card K} \<subseteq> {1..card A}"
  1484         using \<open>finite A\<close> by (auto simp add: K_def intro: card_mono)
  1484         using \<open>finite A\<close> by (auto simp add: K_def intro: card_mono)
  1485     next
  1485     next
  1495         by (simp only:) simp
  1495         by (simp only:) simp
  1496     next
  1496     next
  1497       fix i
  1497       fix i
  1498       have "(\<Sum>I | I \<subseteq> A \<and> card I = i \<and> x \<in> \<Inter>I. 1) = (\<Sum>I | I \<subseteq> K \<and> card I = i. 1 :: int)"
  1498       have "(\<Sum>I | I \<subseteq> A \<and> card I = i \<and> x \<in> \<Inter>I. 1) = (\<Sum>I | I \<subseteq> K \<and> card I = i. 1 :: int)"
  1499         (is "?lhs = ?rhs")
  1499         (is "?lhs = ?rhs")
  1500         by (rule setsum.cong) (auto simp add: K_def)
  1500         by (rule sum.cong) (auto simp add: K_def)
  1501       then show "(- 1) ^ (i + 1) * ?lhs = (- 1) ^ (i + 1) * ?rhs"
  1501       then show "(- 1) ^ (i + 1) * ?lhs = (- 1) ^ (i + 1) * ?rhs"
  1502         by simp
  1502         by simp
  1503     qed
  1503     qed
  1504     also have "{I. I \<subseteq> K \<and> card I = 0} = {{}}"
  1504     also have "{I. I \<subseteq> K \<and> card I = 0} = {{}}"
  1505       using assms by (auto simp add: card_eq_0_iff K_def dest: finite_subset)
  1505       using assms by (auto simp add: card_eq_0_iff K_def dest: finite_subset)
  1506     then have "?rhs = (\<Sum>i = 0..card K. (- 1) ^ (i + 1) * (\<Sum>I | I \<subseteq> K \<and> card I = i. 1 :: int)) + 1"
  1506     then have "?rhs = (\<Sum>i = 0..card K. (- 1) ^ (i + 1) * (\<Sum>I | I \<subseteq> K \<and> card I = i. 1 :: int)) + 1"
  1507       by (subst (2) setsum_head_Suc) simp_all
  1507       by (subst (2) sum_head_Suc) simp_all
  1508     also have "\<dots> = (\<Sum>i = 0..card K. (- 1) * ((- 1) ^ i * int (card K choose i))) + 1"
  1508     also have "\<dots> = (\<Sum>i = 0..card K. (- 1) * ((- 1) ^ i * int (card K choose i))) + 1"
  1509       using K by (subst n_subsets[symmetric]) simp_all
  1509       using K by (subst n_subsets[symmetric]) simp_all
  1510     also have "\<dots> = - (\<Sum>i = 0..card K. (- 1) ^ i * int (card K choose i)) + 1"
  1510     also have "\<dots> = - (\<Sum>i = 0..card K. (- 1) ^ i * int (card K choose i)) + 1"
  1511       by (subst setsum_distrib_left[symmetric]) simp
  1511       by (subst sum_distrib_left[symmetric]) simp
  1512     also have "\<dots> =  - ((-1 + 1) ^ card K) + 1"
  1512     also have "\<dots> =  - ((-1 + 1) ^ card K) + 1"
  1513       by (subst binomial_ring) (simp add: ac_simps)
  1513       by (subst binomial_ring) (simp add: ac_simps)
  1514     also have "\<dots> = 1"
  1514     also have "\<dots> = 1"
  1515       using x K by (auto simp add: K_def card_gt_0_iff)
  1515       using x K by (auto simp add: K_def card_gt_0_iff)
  1516     finally show "?lhs x = 1" .
  1516     finally show "?lhs x = 1" .