src/HOL/Binomial_Plus.thy
author wenzelm
Thu, 06 Jun 2024 23:19:59 +0200
changeset 80276 360e6217cda6
parent 80177 1478555580af
permissions -rw-r--r--
tuned proof: avoid smt/z3 to make this work with arm64-linux;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
80177
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     1
section \<open>More facts about binomial coefficients\<close>
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     2
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     3
text \<open>
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     4
  These facts could have been proven before, but having real numbers
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     5
  makes the proofs a lot easier. Thanks to Alexander Maletzky among others.
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     6
\<close>
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     7
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     8
theory Binomial_Plus
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
     9
imports Real
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    10
begin
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    11
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    12
subsection \<open>More facts about binomial coefficients\<close>
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    13
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    14
text \<open>
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    15
  These facts could have been proven before, but having real numbers
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    16
  makes the proofs a lot easier.
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    17
\<close>
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    18
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    19
lemma central_binomial_odd:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    20
  "odd n \<Longrightarrow> n choose (Suc (n div 2)) = n choose (n div 2)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    21
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    22
  assume "odd n"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    23
  hence "Suc (n div 2) \<le> n" by presburger
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    24
  hence "n choose (Suc (n div 2)) = n choose (n - Suc (n div 2))"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    25
    by (rule binomial_symmetric)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    26
  also from \<open>odd n\<close> have "n - Suc (n div 2) = n div 2" by presburger
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    27
  finally show ?thesis .
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    28
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    29
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    30
lemma binomial_less_binomial_Suc:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    31
  assumes k: "k < n div 2"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    32
  shows   "n choose k < n choose (Suc k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    33
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    34
  from k have k': "k \<le> n" "Suc k \<le> n" by simp_all
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    35
  from k' have "real (n choose k) = fact n / (fact k * fact (n - k))"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    36
    by (simp add: binomial_fact)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    37
  also from k' have "n - k = Suc (n - Suc k)" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    38
  also from k' have "fact \<dots> = (real n - real k) * fact (n - Suc k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    39
    by (subst fact_Suc) (simp_all add: of_nat_diff)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    40
  also from k have "fact k = fact (Suc k) / (real k + 1)" by (simp add: field_simps)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    41
  also have "fact n / (fact (Suc k) / (real k + 1) * ((real n - real k) * fact (n - Suc k))) =
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    42
               (n choose (Suc k)) * ((real k + 1) / (real n - real k))"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    43
    using k by (simp add: field_split_simps binomial_fact)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    44
  also from assms have "(real k + 1) / (real n - real k) < 1" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    45
  finally show ?thesis using k by (simp add: mult_less_cancel_left)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    46
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    47
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    48
lemma binomial_strict_mono:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    49
  assumes "k < k'" "2*k' \<le> n"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    50
  shows   "n choose k < n choose k'"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    51
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    52
  from assms have "k \<le> k' - 1" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    53
  thus ?thesis
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    54
  proof (induction rule: inc_induct)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    55
    case base
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    56
    with assms binomial_less_binomial_Suc[of "k' - 1" n]
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    57
      show ?case by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    58
  next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    59
    case (step k)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    60
    from step.prems step.hyps assms have "n choose k < n choose (Suc k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    61
      by (intro binomial_less_binomial_Suc) simp_all
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    62
    also have "\<dots> < n choose k'" by (rule step.IH)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    63
    finally show ?case .
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    64
  qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    65
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    66
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    67
lemma binomial_mono:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    68
  assumes "k \<le> k'" "2*k' \<le> n"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    69
  shows   "n choose k \<le> n choose k'"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    70
  using assms binomial_strict_mono[of k k' n] by (cases "k = k'") simp_all
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    71
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    72
lemma binomial_strict_antimono:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    73
  assumes "k < k'" "2 * k \<ge> n" "k' \<le> n"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    74
  shows   "n choose k > n choose k'"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    75
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    76
  from assms have "n choose (n - k) > n choose (n - k')"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    77
    by (intro binomial_strict_mono) (simp_all add: algebra_simps)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    78
  with assms show ?thesis by (simp add: binomial_symmetric [symmetric])
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    79
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    80
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    81
lemma binomial_antimono:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    82
  assumes "k \<le> k'" "k \<ge> n div 2" "k' \<le> n"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    83
  shows   "n choose k \<ge> n choose k'"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    84
proof (cases "k = k'")
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    85
  case False
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    86
  note not_eq = False
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    87
  show ?thesis
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    88
  proof (cases "k = n div 2 \<and> odd n")
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    89
    case False
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    90
    with assms(2) have "2*k \<ge> n" by presburger
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    91
    with not_eq assms binomial_strict_antimono[of k k' n]
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    92
      show ?thesis by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    93
  next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    94
    case True
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    95
    have "n choose k' \<le> n choose (Suc (n div 2))"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    96
    proof (cases "k' = Suc (n div 2)")
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    97
      case False
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    98
      with assms True not_eq have "Suc (n div 2) < k'" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
    99
      with assms binomial_strict_antimono[of "Suc (n div 2)" k' n] True
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   100
        show ?thesis by auto
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   101
    qed simp_all
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   102
    also from True have "\<dots> = n choose k" by (simp add: central_binomial_odd)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   103
    finally show ?thesis .
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   104
  qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   105
qed simp_all
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   106
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   107
lemma binomial_maximum: "n choose k \<le> n choose (n div 2)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   108
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   109
  have "k \<le> n div 2 \<longleftrightarrow> 2*k \<le> n" by linarith
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   110
  consider "2*k \<le> n" | "2*k \<ge> n" "k \<le> n" | "k > n" by linarith
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   111
  thus ?thesis
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   112
  proof cases
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   113
    case 1
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   114
    thus ?thesis by (intro binomial_mono) linarith+
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   115
  next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   116
    case 2
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   117
    thus ?thesis by (intro binomial_antimono) simp_all
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   118
  qed (simp_all add: binomial_eq_0)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   119
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   120
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   121
lemma binomial_maximum': "(2*n) choose k \<le> (2*n) choose n"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   122
  using binomial_maximum[of "2*n"] by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   123
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   124
lemma central_binomial_lower_bound:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   125
  assumes "n > 0"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   126
  shows   "4^n / (2*real n) \<le> real ((2*n) choose n)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   127
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   128
  from binomial[of 1 1 "2*n"]
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   129
    have "4 ^ n = (\<Sum>k\<le>2*n. (2*n) choose k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   130
    by (simp add: power_mult power2_eq_square One_nat_def [symmetric] del: One_nat_def)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   131
  also have "{..2*n} = {0<..<2*n} \<union> {0,2*n}" by auto
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   132
  also have "(\<Sum>k\<in>\<dots>. (2*n) choose k) =
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   133
             (\<Sum>k\<in>{0<..<2*n}. (2*n) choose k) + (\<Sum>k\<in>{0,2*n}. (2*n) choose k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   134
    by (subst sum.union_disjoint) auto
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   135
  also have "(\<Sum>k\<in>{0,2*n}. (2*n) choose k) \<le> (\<Sum>k\<le>1. (n choose k)\<^sup>2)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   136
    by (cases n) simp_all
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   137
  also from assms have "\<dots> \<le> (\<Sum>k\<le>n. (n choose k)\<^sup>2)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   138
    by (intro sum_mono2) auto
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   139
  also have "\<dots> = (2*n) choose n" by (rule choose_square_sum)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   140
  also have "(\<Sum>k\<in>{0<..<2*n}. (2*n) choose k) \<le> (\<Sum>k\<in>{0<..<2*n}. (2*n) choose n)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   141
    by (intro sum_mono binomial_maximum')
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   142
  also have "\<dots> = card {0<..<2*n} * ((2*n) choose n)" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   143
  also have "card {0<..<2*n} \<le> 2*n - 1" by (cases n) simp_all
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   144
  also have "(2 * n - 1) * (2 * n choose n) + (2 * n choose n) = ((2*n) choose n) * (2*n)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   145
    using assms by (simp add: algebra_simps)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   146
  finally have "4 ^ n \<le> (2 * n choose n) * (2 * n)" by simp_all
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   147
  hence "real (4 ^ n) \<le> real ((2 * n choose n) * (2 * n))"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   148
    by (subst of_nat_le_iff)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   149
  with assms show ?thesis by (simp add: field_simps)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   150
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   151
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   152
lemma upper_le_binomial:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   153
  assumes "0 < k" and "k < n"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   154
  shows "n \<le> n choose k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   155
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   156
  from assms have "1 \<le> n" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   157
  define k' where "k' = (if n div 2 \<le> k then k else n - k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   158
  from assms have 1: "k' \<le> n - 1" and 2: "n div 2 \<le> k'" by (auto simp: k'_def)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   159
  from assms(2) have "k \<le> n" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   160
  have "n choose k = n choose k'" by (simp add: k'_def binomial_symmetric[OF \<open>k \<le> n\<close>])
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   161
  have "n = n choose 1" by (simp only: choose_one)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   162
  also from \<open>1 \<le> n\<close> have "\<dots> = n choose (n - 1)" by (rule binomial_symmetric)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   163
  also from 1 2 have "\<dots> \<le> n choose k'" by (rule binomial_antimono) simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   164
  also have "\<dots> = n choose k" by (simp add: k'_def binomial_symmetric[OF \<open>k \<le> n\<close>])
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   165
  finally show ?thesis .
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   166
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   167
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   168
subsection \<open>Results about binomials and integers, thanks to Alexander Maletzky\<close>
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   169
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   170
text \<open>Restore original sort constraints: semidom rather than field of char 0\<close>
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   171
setup \<open>Sign.add_const_constraint (@{const_name gbinomial}, SOME @{typ "'a::{semidom_divide,semiring_char_0} \<Rightarrow> nat \<Rightarrow> 'a"})\<close>
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   172
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   173
lemma gbinomial_eq_0_int:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   174
  assumes "n < k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   175
  shows "(int n) gchoose k = 0"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   176
  by (simp add: assms gbinomial_prod_rev prod_zero)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   177
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   178
corollary gbinomial_eq_0: "0 \<le> a \<Longrightarrow> a < int k \<Longrightarrow> a gchoose k = 0"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   179
  by (metis nat_eq_iff2 nat_less_iff gbinomial_eq_0_int)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   180
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   181
lemma int_binomial: "int (n choose k) = (int n) gchoose k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   182
proof (cases "k \<le> n")
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   183
  case True
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   184
  from refl have eq: "(\<Prod>i = 0..<k. int (n - i)) = (\<Prod>i = 0..<k. int n - int i)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   185
  proof (rule prod.cong)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   186
    fix i
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   187
    assume "i \<in> {0..<k}"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   188
    with True show "int (n - i) = int n - int i" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   189
  qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   190
  show ?thesis
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   191
    by (simp add: gbinomial_binomial[symmetric] gbinomial_prod_rev zdiv_int eq)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   192
next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   193
  case False
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   194
  thus ?thesis by (simp add: gbinomial_eq_0_int)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   195
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   196
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   197
lemma falling_fact_pochhammer: "prod (\<lambda>i. a - int i) {0..<k} = (- 1) ^ k * pochhammer (- a) k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   198
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   199
  have eq: "z ^ Suc n * prod f {0..n} = prod (\<lambda>x. z * f x) {0..n}" for z::int and n f
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   200
    by (induct n) (simp_all add: ac_simps)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   201
  show ?thesis
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   202
  proof (cases k)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   203
    case 0
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   204
    thus ?thesis by (simp add: pochhammer_minus)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   205
  next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   206
    case (Suc n)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   207
    thus ?thesis
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   208
      by (simp only: pochhammer_prod atLeastLessThanSuc_atLeastAtMost
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   209
          prod.atLeast_Suc_atMost_Suc_shift eq flip: power_mult_distrib) (simp add: of_nat_diff)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   210
  qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   211
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   212
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   213
lemma falling_fact_pochhammer': "prod (\<lambda>i. a - int i) {0..<k} = pochhammer (a - int k + 1) k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   214
  by (simp add: falling_fact_pochhammer pochhammer_minus')
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   215
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   216
lemma gbinomial_int_pochhammer: "(a::int) gchoose k = (- 1) ^ k * pochhammer (- a) k div fact k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   217
  by (simp only: gbinomial_prod_rev falling_fact_pochhammer)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   218
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   219
lemma gbinomial_int_pochhammer': "a gchoose k = pochhammer (a - int k + 1) k div fact k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   220
  by (simp only: gbinomial_prod_rev falling_fact_pochhammer')
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   221
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   222
lemma fact_dvd_pochhammer: "fact k dvd pochhammer (a::int) k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   223
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   224
  have dvd: "y \<noteq> 0 \<Longrightarrow> ((of_int (x div y))::'a::field_char_0) = of_int x / of_int y \<Longrightarrow> y dvd x"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   225
    for x y :: int
80276
360e6217cda6 tuned proof: avoid smt/z3 to make this work with arm64-linux;
wenzelm
parents: 80177
diff changeset
   226
    by (metis dvd_triv_right nonzero_eq_divide_eq of_int_0_eq_iff of_int_eq_iff of_int_mult)
80177
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   227
  show ?thesis
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   228
  proof (cases "0 < a")
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   229
    case True
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   230
    moreover define n where "n = nat (a - 1) + k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   231
    ultimately have a: "a = int n - int k + 1" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   232
    from fact_nonzero show ?thesis unfolding a
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   233
    proof (rule dvd)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   234
      have "of_int (pochhammer (int n - int k + 1) k div fact k) = (of_int (int n gchoose k)::rat)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   235
        by (simp only: gbinomial_int_pochhammer')
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   236
      also have "\<dots> = of_nat (n choose k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   237
        by (metis int_binomial of_int_of_nat_eq)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   238
      also have "\<dots> = (of_nat n) gchoose k" by (fact binomial_gbinomial)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   239
      also have "\<dots> = pochhammer (of_nat n - of_nat k + 1) k / fact k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   240
        by (fact gbinomial_pochhammer')
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   241
      also have "\<dots> = pochhammer (of_int (int n - int k + 1)) k / fact k" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   242
      also have "\<dots> = (of_int (pochhammer (int n - int k + 1) k)) / (of_int (fact k))"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   243
        by (simp only: of_int_fact pochhammer_of_int)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   244
      finally show "of_int (pochhammer (int n - int k + 1) k div fact k) =
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   245
                      of_int (pochhammer (int n - int k + 1) k) / rat_of_int (fact k)" .
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   246
    qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   247
  next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   248
    case False
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   249
    moreover define n where "n = nat (- a)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   250
    ultimately have a: "a = - int n" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   251
    from fact_nonzero have "fact k dvd (-1)^k * pochhammer (- int n) k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   252
    proof (rule dvd)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   253
      have "of_int ((-1)^k * pochhammer (- int n) k div fact k) = (of_int (int n gchoose k)::rat)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   254
        by (metis falling_fact_pochhammer gbinomial_prod_rev)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   255
      also have "\<dots> = of_int (int (n choose k))" by (simp only: int_binomial)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   256
      also have "\<dots> = of_nat (n choose k)" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   257
      also have "\<dots> = (of_nat n) gchoose k" by (fact binomial_gbinomial)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   258
      also have "\<dots> = (-1)^k * pochhammer (- of_nat n) k / fact k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   259
        by (fact gbinomial_pochhammer)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   260
      also have "\<dots> = (-1)^k * pochhammer (of_int (- int n)) k / fact k" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   261
      also have "\<dots> = (-1)^k * (of_int (pochhammer (- int n) k)) / (of_int (fact k))"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   262
        by (simp only: of_int_fact pochhammer_of_int)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   263
      also have "\<dots> = (of_int ((-1)^k * pochhammer (- int n) k)) / (of_int (fact k))" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   264
      finally show "of_int ((- 1) ^ k * pochhammer (- int n) k div fact k) =
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   265
                    of_int ((- 1) ^ k * pochhammer (- int n) k) / rat_of_int (fact k)" .
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   266
    qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   267
    thus ?thesis unfolding a by (metis dvdI dvd_mult_unit_iff' minus_one_mult_self)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   268
  qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   269
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   270
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   271
lemma gbinomial_int_negated_upper: "(a gchoose k) = (-1) ^ k * ((int k - a - 1) gchoose k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   272
  by (simp add: gbinomial_int_pochhammer pochhammer_minus algebra_simps fact_dvd_pochhammer div_mult_swap)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   273
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   274
lemma gbinomial_int_mult_fact: "fact k * (a gchoose k) = (\<Prod>i = 0..<k. a - int i)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   275
  by (simp only: gbinomial_int_pochhammer' fact_dvd_pochhammer dvd_mult_div_cancel falling_fact_pochhammer')
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   276
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   277
corollary gbinomial_int_mult_fact': "(a gchoose k) * fact k = (\<Prod>i = 0..<k. a - int i)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   278
  using gbinomial_int_mult_fact[of k a] by (simp add: ac_simps)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   279
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   280
lemma gbinomial_int_binomial:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   281
  "a gchoose k = (if 0 \<le> a then int ((nat a) choose k) else (-1::int)^k * int ((k + (nat (- a)) - 1) choose k))"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   282
  by (auto simp: int_binomial gbinomial_int_negated_upper[of a] int_ops(6))
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   283
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   284
corollary gbinomial_nneg: "0 \<le> a \<Longrightarrow> a gchoose k = int ((nat a) choose k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   285
  by (simp add: gbinomial_int_binomial)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   286
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   287
corollary gbinomial_neg: "a < 0 \<Longrightarrow> a gchoose k = (-1::int)^k * int ((k + (nat (- a)) - 1) choose k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   288
  by (simp add: gbinomial_int_binomial)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   289
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   290
lemma of_int_gbinomial: "of_int (a gchoose k) = (of_int a :: 'a::field_char_0) gchoose k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   291
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   292
  have of_int_div: "y dvd x \<Longrightarrow> of_int (x div y) = of_int x / (of_int y :: 'a)" for x y :: int by auto
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   293
  show ?thesis
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   294
    by (simp add: gbinomial_int_pochhammer' gbinomial_pochhammer' of_int_div fact_dvd_pochhammer
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   295
        pochhammer_of_int[symmetric])
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   296
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   297
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   298
lemma uminus_one_gbinomial [simp]: "(- 1::int) gchoose k = (- 1) ^ k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   299
  by (simp add: gbinomial_int_binomial)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   300
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   301
lemma gbinomial_int_Suc_Suc: "(x + 1::int) gchoose (Suc k) = (x gchoose k) + (x gchoose (Suc k))"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   302
proof (rule linorder_cases)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   303
  assume 1: "x + 1 < 0"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   304
  hence 2: "x < 0" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   305
  then obtain n where 3: "nat (- x) = Suc n" using not0_implies_Suc by fastforce
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   306
  hence 4: "nat (- x - 1) = n" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   307
  show ?thesis
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   308
  proof (cases k)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   309
    case 0
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   310
    show ?thesis by (simp add: \<open>k = 0\<close>)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   311
  next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   312
    case (Suc k')
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   313
    from 1 2 3 4 show ?thesis by (simp add: \<open>k = Suc k'\<close> gbinomial_int_binomial int_distrib(2))
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   314
  qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   315
next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   316
  assume "x + 1 = 0"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   317
  hence "x = - 1" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   318
  thus ?thesis by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   319
next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   320
  assume "0 < x + 1"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   321
  hence "0 \<le> x + 1" and "0 \<le> x" and "nat (x + 1) = Suc (nat x)" by simp_all
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   322
  thus ?thesis by (simp add: gbinomial_int_binomial)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   323
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   324
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   325
corollary plus_Suc_gbinomial:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   326
  "(x + (1 + int k)) gchoose (Suc k) = ((x + int k) gchoose k) + ((x + int k) gchoose (Suc k))"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   327
    (is "?l = ?r")
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   328
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   329
  have "?l = (x + int k + 1) gchoose (Suc k)" by (simp only: ac_simps)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   330
  also have "\<dots> = ?r" by (fact gbinomial_int_Suc_Suc)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   331
  finally show ?thesis .
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   332
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   333
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   334
lemma gbinomial_int_n_n [simp]: "(int n) gchoose n = 1"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   335
proof (induct n)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   336
  case 0
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   337
  show ?case by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   338
next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   339
  case (Suc n)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   340
  have "int (Suc n) gchoose Suc n = (int n + 1) gchoose Suc n" by (simp add: add.commute)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   341
  also have "\<dots> = (int n gchoose n) + (int n gchoose (Suc n))" by (fact gbinomial_int_Suc_Suc)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   342
  finally show ?case by (simp add: Suc gbinomial_eq_0)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   343
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   344
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   345
lemma gbinomial_int_Suc_n [simp]: "(1 + int n) gchoose n = 1 + int n"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   346
proof (induct n)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   347
  case 0
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   348
  show ?case by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   349
next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   350
  case (Suc n)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   351
  have "1 + int (Suc n) gchoose Suc n = (1 + int n) + 1 gchoose Suc n" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   352
  also have "\<dots> = (1 + int n gchoose n) + (1 + int n gchoose (Suc n))" by (fact gbinomial_int_Suc_Suc)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   353
  also have "\<dots> = 1 + int n + (int (Suc n) gchoose (Suc n))" by (simp add: Suc)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   354
  also have "\<dots> = 1 + int (Suc n)" by (simp only: gbinomial_int_n_n)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   355
  finally show ?case .
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   356
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   357
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   358
lemma zbinomial_eq_0_iff [simp]: "a gchoose k = 0 \<longleftrightarrow> (0 \<le> a \<and> a < int k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   359
proof
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   360
  assume a: "a gchoose k = 0"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   361
  have 1: "b < int k" if "b gchoose k = 0" for b
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   362
  proof (rule ccontr)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   363
    assume "\<not> b < int k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   364
    hence "0 \<le> b" and "k \<le> nat b" by simp_all
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   365
    from this(1) have "int ((nat b) choose k) = b gchoose k" by (simp add: gbinomial_int_binomial)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   366
    also have "\<dots> = 0" by (fact that)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   367
    finally show False using \<open>k \<le> nat b\<close> by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   368
  qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   369
  show "0 \<le> a \<and> a < int k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   370
  proof
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   371
    show "0 \<le> a"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   372
    proof (rule ccontr)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   373
      assume "\<not> 0 \<le> a"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   374
      hence "(-1) ^ k * ((int k - a - 1) gchoose k) = a gchoose k"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   375
        by (simp add: gbinomial_int_negated_upper[of a])
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   376
      also have "\<dots> = 0" by (fact a)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   377
      finally have "(int k - a - 1) gchoose k = 0" by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   378
      hence "int k - a - 1 < int k" by (rule 1)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   379
      with \<open>\<not> 0 \<le> a\<close> show False by simp
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   380
    qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   381
  next
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   382
    from a show "a < int k" by (rule 1)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   383
  qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   384
qed (auto intro: gbinomial_eq_0)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   385
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   386
subsection \<open>Sums\<close>
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   387
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   388
lemma gchoose_rising_sum_nat: "(\<Sum>j\<le>n. int j + int k gchoose k) = (int n + int k + 1) gchoose (Suc k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   389
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   390
  have "(\<Sum>j\<le>n. int j + int k gchoose k) = int (\<Sum>j\<le>n. k + j choose k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   391
    by (simp add: int_binomial add.commute)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   392
  also have "(\<Sum>j\<le>n. k + j choose k) = (k + n + 1) choose (k + 1)" by (fact choose_rising_sum(1))
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   393
  also have "int \<dots> = (int n + int k + 1) gchoose (Suc k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   394
    by (simp add: int_binomial ac_simps del: binomial_Suc_Suc)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   395
  finally show ?thesis .
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   396
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   397
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   398
lemma gchoose_rising_sum:
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   399
  assumes "0 \<le> n"   \<comment>\<open>Necessary condition.\<close>
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   400
  shows "(\<Sum>j=0..n. j + int k gchoose k) = (n + int k + 1) gchoose (Suc k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   401
proof -
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   402
  from _ refl have "(\<Sum>j=0..n. j + int k gchoose k) = (\<Sum>j\<in>int ` {0..nat n}. j + int k gchoose k)"
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   403
  proof (rule sum.cong)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   404
    from assms show "{0..n} = int ` {0..nat n}" by (simp add: image_int_atLeastAtMost)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   405
  qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   406
  also have "\<dots> = (\<Sum>j\<le>nat n. int j + int k gchoose k)" by (simp add: sum.reindex atMost_atLeast0)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   407
  also have "\<dots> = (int (nat n) + int k + 1) gchoose (Suc k)" by (fact gchoose_rising_sum_nat)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   408
  also from assms have "\<dots> = (n + int k + 1) gchoose (Suc k)" by (simp add: add.assoc add.commute)
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   409
  finally show ?thesis .
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   410
qed
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   411
1478555580af More binomial material
paulson <lp15@cam.ac.uk>
parents:
diff changeset
   412
end