src/HOL/Number_Theory/Binomial.thy
changeset 58841 e16712bb1d41
parent 58833 09974789e483
child 58889 5b7a9633cfa8
equal deleted inserted replaced
58840:f4bb3068d819 58841:e16712bb1d41
    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)