56 by (metis binomial_eq_0 less_numeral_extra(3) not_less zero_less_binomial) |
56 by (metis binomial_eq_0 less_numeral_extra(3) not_less zero_less_binomial) |
57 |
57 |
58 lemma zero_less_binomial_iff [simp]: "n choose k > 0 \<longleftrightarrow> k \<le> n" |
58 lemma zero_less_binomial_iff [simp]: "n choose k > 0 \<longleftrightarrow> k \<le> n" |
59 by (metis binomial_eq_0_iff not_less0 not_less zero_less_binomial) |
59 by (metis binomial_eq_0_iff not_less0 not_less zero_less_binomial) |
60 |
60 |
61 (*Might be more useful if re-oriented*) |
|
62 lemma Suc_times_binomial_eq: |
61 lemma Suc_times_binomial_eq: |
63 "k \<le> n \<Longrightarrow> Suc n * (n choose k) = (Suc n choose Suc k) * Suc k" |
62 "k \<le> n \<Longrightarrow> Suc n * (n choose k) = (Suc n choose Suc k) * Suc k" |
64 apply (induct n arbitrary: k) |
63 apply (induct n arbitrary: k, simp) |
65 apply (simp add: binomial.simps) |
64 apply (case_tac k) |
66 apply (case_tac k) |
65 apply (auto simp add: add_mult_distrib add_mult_distrib2 le_Suc_eq binomial_eq_0) |
67 apply (auto simp add: add_mult_distrib add_mult_distrib2 le_Suc_eq binomial_eq_0) |
|
68 done |
66 done |
69 |
67 |
70 text{*This is the well-known version, but it's harder to use because of the |
68 text{*The absorption property*} |
|
69 lemma Suc_times_binomial: |
|
70 "k \<le> n \<Longrightarrow> (Suc n choose Suc k) * Suc k = Suc n * (n choose k)" |
|
71 by (rule Suc_times_binomial_eq [symmetric]) |
|
72 |
|
73 text{*This is the well-known version of absorption, but it's harder to use because of the |
71 need to reason about division.*} |
74 need to reason about division.*} |
72 lemma binomial_Suc_Suc_eq_times: |
75 lemma binomial_Suc_Suc_eq_times: |
73 "k \<le> n \<Longrightarrow> (Suc n choose Suc k) = (Suc n * (n choose k)) div Suc k" |
76 "k \<le> n \<Longrightarrow> (Suc n choose Suc k) = (Suc n * (n choose k)) div Suc k" |
74 by (simp add: Suc_times_binomial_eq del: mult_Suc mult_Suc_right) |
77 by (simp add: Suc_times_binomial_eq del: mult_Suc mult_Suc_right) |
75 |
78 |
76 text{*Another version, with -1 instead of Suc.*} |
79 text{*Another version of absorption, with -1 instead of Suc.*} |
77 lemma times_binomial_minus1_eq: |
80 lemma times_binomial_minus1_eq: |
78 "k \<le> n \<Longrightarrow> 0 < k \<Longrightarrow> (n choose k) * k = n * ((n - 1) choose (k - 1))" |
81 "k \<le> n \<Longrightarrow> 0 < k \<Longrightarrow> (n choose k) * k = n * ((n - 1) choose (k - 1))" |
79 using Suc_times_binomial_eq [where n = "n - 1" and k = "k - 1"] |
82 using Suc_times_binomial_eq [where n = "n - 1" and k = "k - 1"] |
80 by (auto split add: nat_diff_split) |
83 by (auto split add: nat_diff_split) |
81 |
84 |
199 lemma natsum_reverse_index: |
202 lemma natsum_reverse_index: |
200 fixes m::nat |
203 fixes m::nat |
201 shows "(\<And>k. m \<le> k \<Longrightarrow> k \<le> n \<Longrightarrow> g k = f (m + n - k)) \<Longrightarrow> (\<Sum>k=m..n. f k) = (\<Sum>k=m..n. g k)" |
204 shows "(\<And>k. m \<le> k \<Longrightarrow> k \<le> n \<Longrightarrow> g k = f (m + n - k)) \<Longrightarrow> (\<Sum>k=m..n. f k) = (\<Sum>k=m..n. g k)" |
202 by (rule setsum.reindex_bij_witness[where i="\<lambda>k. m+n-k" and j="\<lambda>k. m+n-k"]) auto |
205 by (rule setsum.reindex_bij_witness[where i="\<lambda>k. m+n-k" and j="\<lambda>k. m+n-k"]) auto |
203 |
206 |
|
207 text{*NW diagonal sum property*} |
204 lemma sum_choose_diagonal: |
208 lemma sum_choose_diagonal: |
205 assumes "m\<le>n" shows "(\<Sum>k=0..m. (n-k) choose (m-k)) = Suc n choose m" |
209 assumes "m\<le>n" shows "(\<Sum>k=0..m. (n-k) choose (m-k)) = Suc n choose m" |
206 proof - |
210 proof - |
207 have "(\<Sum>k=0..m. (n-k) choose (m-k)) = (\<Sum>k=0..m. (n-m+k) choose k)" |
211 have "(\<Sum>k=0..m. (n-k) choose (m-k)) = (\<Sum>k=0..m. (n-m+k) choose k)" |
208 by (rule natsum_reverse_index) (simp add: assms) |
212 by (rule natsum_reverse_index) (simp add: assms) |