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