changeset 63366 | 209c4cbbc4cd |
parent 63363 | bd483ddb17f2 |
child 63367 | 6c731c8b7f03 |
63365:5340fb6633d0 | 63366:209c4cbbc4cd |
---|---|
25 lemma fact_Suc_0 [simp]: "fact (Suc 0) = Suc 0" |
25 lemma fact_Suc_0 [simp]: "fact (Suc 0) = Suc 0" |
26 by simp |
26 by simp |
27 |
27 |
28 lemma of_nat_fact [simp]: |
28 lemma of_nat_fact [simp]: |
29 "of_nat (fact n) = fact n" |
29 "of_nat (fact n) = fact n" |
30 by (induct n) (auto simp add: algebra_simps of_nat_mult) |
30 by (induct n) (auto simp add: algebra_simps) |
31 |
31 |
32 lemma of_int_fact [simp]: |
32 lemma of_int_fact [simp]: |
33 "of_int (fact n) = fact n" |
33 "of_int (fact n) = fact n" |
34 proof - |
34 proof - |
35 have "of_int (of_nat (fact n)) = fact n" |
35 have "of_int (of_nat (fact n)) = fact n" |
170 text \<open>This development is based on the work of Andy Gordon and |
170 text \<open>This development is based on the work of Andy Gordon and |
171 Florian Kammueller.\<close> |
171 Florian Kammueller.\<close> |
172 |
172 |
173 subsection \<open>Basic definitions and lemmas\<close> |
173 subsection \<open>Basic definitions and lemmas\<close> |
174 |
174 |
175 primrec binomial :: "nat \<Rightarrow> nat \<Rightarrow> nat" (infixl "choose" 65) |
175 text \<open>Combinatorial definition\<close> |
176 |
|
177 definition binomial :: "nat \<Rightarrow> nat \<Rightarrow> nat" (infixl "choose" 65) |
|
176 where |
178 where |
177 "0 choose k = (if k = 0 then 1 else 0)" |
179 "n choose k = card {K\<in>Pow {..<n}. card K = k}" |
178 | "Suc n choose k = (if k = 0 then 1 else (n choose (k - 1)) + (n choose k))" |
180 |
179 |
181 theorem n_subsets: |
180 lemma binomial_n_0 [simp]: "(n choose 0) = 1" |
182 assumes "finite A" |
181 by (cases n) simp_all |
183 shows "card {B. B \<subseteq> A \<and> card B = k} = card A choose k" |
182 |
184 proof - |
183 lemma binomial_0_Suc [simp]: "(0 choose Suc k) = 0" |
185 from assms obtain f where bij: "bij_betw f {..<card A} A" |
184 by simp |
186 by (blast elim: bij_betw_nat_finite) |
185 |
187 then have [simp]: "card (f ` C) = card C" if "C \<subseteq> {..<card A}" for C |
186 lemma binomial_Suc_Suc [simp]: "(Suc n choose Suc k) = (n choose k) + (n choose Suc k)" |
188 by (meson bij_betw_imp_inj_on bij_betw_subset card_image that) |
187 by simp |
189 from bij have "bij_betw (image f) (Pow {..<card A}) (Pow A)" |
190 by (rule bij_betw_Pow) |
|
191 then have "inj_on (image f) (Pow {..<card A})" |
|
192 by (rule bij_betw_imp_inj_on) |
|
193 moreover have "{K. K \<subseteq> {..<card A} \<and> card K = k} \<subseteq> Pow {..<card A}" |
|
194 by auto |
|
195 ultimately have "inj_on (image f) {K. K \<subseteq> {..<card A} \<and> card K = k}" |
|
196 by (rule inj_on_subset) |
|
197 then have "card {K. K \<subseteq> {..<card A} \<and> card K = k} = |
|
198 card (image f ` {K. K \<subseteq> {..<card A} \<and> card K = k})" (is "_ = card ?C") |
|
199 by (simp add: card_image) |
|
200 also have "?C = {K. K \<subseteq> f ` {..<card A} \<and> card K = k}" |
|
201 by (auto elim!: subset_imageE) |
|
202 also have "f ` {..<card A} = A" |
|
203 by (meson bij bij_betw_def) |
|
204 finally show ?thesis |
|
205 by (simp add: binomial_def) |
|
206 qed |
|
207 |
|
208 text \<open>Recursive characterization\<close> |
|
209 |
|
210 lemma binomial_n_0 [simp, code]: |
|
211 "n choose 0 = 1" |
|
212 proof - |
|
213 have "{K \<in> Pow {..<n}. card K = 0} = {{}}" |
|
214 by (auto dest: subset_eq_range_finite) |
|
215 then show ?thesis |
|
216 by (simp add: binomial_def) |
|
217 qed |
|
218 |
|
219 lemma binomial_0_Suc [simp, code]: |
|
220 "0 choose Suc k = 0" |
|
221 by (simp add: binomial_def) |
|
222 |
|
223 lemma binomial_Suc_Suc [simp, code]: |
|
224 "Suc n choose Suc k = (n choose k) + (n choose Suc k)" |
|
225 proof - |
|
226 let ?P = "\<lambda>n k. {K. K \<subseteq> {..<n} \<and> card K = k}" |
|
227 let ?Q = "?P (Suc n) (Suc k)" |
|
228 have inj: "inj_on (insert n) (?P n k)" |
|
229 by rule auto |
|
230 have disjoint: "insert n ` ?P n k \<inter> ?P n (Suc k) = {}" |
|
231 by auto |
|
232 have "?Q = {K\<in>?Q. n \<in> K} \<union> {K\<in>?Q. n \<notin> K}" |
|
233 by auto |
|
234 also have "{K\<in>?Q. n \<in> K} = insert n ` ?P n k" (is "?A = ?B") |
|
235 proof (rule set_eqI) |
|
236 fix K |
|
237 have K_finite: "finite K" if "K \<subseteq> insert n {..<n}" |
|
238 using that by (rule finite_subset) simp_all |
|
239 have Suc_card_K: "Suc (card K - Suc 0) = card K" if "n \<in> K" |
|
240 and "finite K" |
|
241 proof - |
|
242 from \<open>n \<in> K\<close> obtain L where "K = insert n L" and "n \<notin> L" |
|
243 by (blast elim: Set.set_insert) |
|
244 with that show ?thesis by (simp add: card_insert) |
|
245 qed |
|
246 show "K \<in> ?A \<longleftrightarrow> K \<in> ?B" |
|
247 by (subst in_image_insert_iff) |
|
248 (auto simp add: card_insert subset_eq_range_finite Diff_subset_conv K_finite Suc_card_K) |
|
249 qed |
|
250 also have "{K\<in>?Q. n \<notin> K} = ?P n (Suc k)" |
|
251 by (auto simp add: lessThan_Suc) |
|
252 finally show ?thesis using inj disjoint |
|
253 by (simp add: binomial_def card_Un_disjoint card_image) |
|
254 qed |
|
255 |
|
256 lemma binomial_eq_0: |
|
257 "n < k \<Longrightarrow> n choose k = 0" |
|
258 by (auto simp add: binomial_def dest: subset_eq_range_card) |
|
259 |
|
260 lemma zero_less_binomial: "k \<le> n \<Longrightarrow> n choose k > 0" |
|
261 by (induct n k rule: diff_induct) simp_all |
|
262 |
|
263 lemma binomial_eq_0_iff [simp]: |
|
264 "n choose k = 0 \<longleftrightarrow> n < k" |
|
265 by (metis binomial_eq_0 less_numeral_extra(3) not_less zero_less_binomial) |
|
266 |
|
267 lemma zero_less_binomial_iff [simp]: |
|
268 "n choose k > 0 \<longleftrightarrow> k \<le> n" |
|
269 by (metis binomial_eq_0_iff not_less0 not_less zero_less_binomial) |
|
270 |
|
271 lemma binomial_n_n [simp]: "n choose n = 1" |
|
272 by (induct n) (simp_all add: binomial_eq_0) |
|
273 |
|
274 lemma binomial_Suc_n [simp]: "Suc n choose n = Suc n" |
|
275 by (induct n) simp_all |
|
276 |
|
277 lemma binomial_1 [simp]: "n choose Suc 0 = n" |
|
278 by (induct n) simp_all |
|
188 |
279 |
189 lemma choose_reduce_nat: |
280 lemma choose_reduce_nat: |
190 "0 < (n::nat) \<Longrightarrow> 0 < k \<Longrightarrow> |
281 "0 < (n::nat) \<Longrightarrow> 0 < k \<Longrightarrow> |
191 (n choose k) = ((n - 1) choose (k - 1)) + ((n - 1) choose k)" |
282 (n choose k) = ((n - 1) choose (k - 1)) + ((n - 1) choose k)" |
192 by (metis Suc_diff_1 binomial.simps(2) neq0_conv) |
283 using binomial_Suc_Suc [of "n - 1" "k - 1"] by simp |
193 |
|
194 lemma binomial_eq_0: "n < k \<Longrightarrow> n choose k = 0" |
|
195 by (induct n arbitrary: k) auto |
|
196 |
|
197 declare binomial.simps [simp del] |
|
198 |
|
199 lemma binomial_n_n [simp]: "n choose n = 1" |
|
200 by (induct n) (simp_all add: binomial_eq_0) |
|
201 |
|
202 lemma binomial_Suc_n [simp]: "Suc n choose n = Suc n" |
|
203 by (induct n) simp_all |
|
204 |
|
205 lemma binomial_1 [simp]: "n choose Suc 0 = n" |
|
206 by (induct n) simp_all |
|
207 |
|
208 lemma zero_less_binomial: "k \<le> n \<Longrightarrow> n choose k > 0" |
|
209 by (induct n k rule: diff_induct) simp_all |
|
210 |
|
211 lemma binomial_eq_0_iff [simp]: "n choose k = 0 \<longleftrightarrow> n < k" |
|
212 by (metis binomial_eq_0 less_numeral_extra(3) not_less zero_less_binomial) |
|
213 |
|
214 lemma zero_less_binomial_iff [simp]: "n choose k > 0 \<longleftrightarrow> k \<le> n" |
|
215 by (metis binomial_eq_0_iff not_less0 not_less zero_less_binomial) |
|
216 |
284 |
217 lemma Suc_times_binomial_eq: |
285 lemma Suc_times_binomial_eq: |
218 "Suc n * (n choose k) = (Suc n choose Suc k) * Suc k" |
286 "Suc n * (n choose k) = (Suc n choose Suc k) * Suc k" |
219 apply (induct n arbitrary: k, simp add: binomial.simps) |
287 apply (induct n arbitrary: k) |
288 apply simp apply arith |
|
220 apply (case_tac k) |
289 apply (case_tac k) |
221 apply (auto simp add: add_mult_distrib add_mult_distrib2 le_Suc_eq binomial_eq_0) |
290 apply (auto simp add: add_mult_distrib add_mult_distrib2 le_Suc_eq binomial_eq_0) |
222 done |
291 done |
223 |
292 |
224 lemma binomial_le_pow2: "n choose k \<le> 2^n" |
293 lemma binomial_le_pow2: "n choose k \<le> 2^n" |
225 apply (induction n arbitrary: k) |
294 apply (induct n arbitrary: k) |
226 apply (simp add: binomial.simps) |
295 apply (case_tac k) apply simp_all |
227 apply (case_tac k) |
296 apply (case_tac k) |
228 apply (auto simp: power_Suc) |
297 apply auto |
229 by (simp add: add_le_mono mult_2) |
298 apply (simp add: add_le_mono mult_2) |
299 done |
|
230 |
300 |
231 text\<open>The absorption property\<close> |
301 text\<open>The absorption property\<close> |
232 lemma Suc_times_binomial: |
302 lemma Suc_times_binomial: |
233 "Suc k * (Suc n choose Suc k) = Suc n * (n choose k)" |
303 "Suc k * (Suc n choose Suc k) = Suc n * (n choose k)" |
234 using Suc_times_binomial_eq by auto |
304 using Suc_times_binomial_eq by auto |
242 text\<open>Another version of absorption, with -1 instead of Suc.\<close> |
312 text\<open>Another version of absorption, with -1 instead of Suc.\<close> |
243 lemma times_binomial_minus1_eq: |
313 lemma times_binomial_minus1_eq: |
244 "0 < k \<Longrightarrow> k * (n choose k) = n * ((n - 1) choose (k - 1))" |
314 "0 < k \<Longrightarrow> k * (n choose k) = n * ((n - 1) choose (k - 1))" |
245 using Suc_times_binomial_eq [where n = "n - 1" and k = "k - 1"] |
315 using Suc_times_binomial_eq [where n = "n - 1" and k = "k - 1"] |
246 by (auto split add: nat_diff_split) |
316 by (auto split add: nat_diff_split) |
247 |
|
248 |
|
249 subsection \<open>Combinatorial theorems involving \<open>choose\<close>\<close> |
|
250 |
|
251 text \<open>By Florian Kamm\"uller, tidied by LCP.\<close> |
|
252 |
|
253 lemma card_s_0_eq_empty: "finite A \<Longrightarrow> card {B. B \<subseteq> A & card B = 0} = 1" |
|
254 by (simp cong add: conj_cong add: finite_subset [THEN card_0_eq]) |
|
255 |
|
256 lemma choose_deconstruct: "finite M \<Longrightarrow> x \<notin> M \<Longrightarrow> |
|
257 {s. s \<subseteq> insert x M \<and> card s = Suc k} = |
|
258 {s. s \<subseteq> M \<and> card s = Suc k} \<union> {s. \<exists>t. t \<subseteq> M \<and> card t = k \<and> s = insert x t}" |
|
259 apply safe |
|
260 apply (auto intro: finite_subset [THEN card_insert_disjoint]) |
|
261 by (metis (full_types) Diff_insert_absorb Set.set_insert Zero_neq_Suc card_Diff_singleton_if |
|
262 card_eq_0_iff diff_Suc_1 in_mono subset_insert_iff) |
|
263 |
|
264 lemma finite_bex_subset [simp]: |
|
265 assumes "finite B" |
|
266 and "\<And>A. A \<subseteq> B \<Longrightarrow> finite {x. P x A}" |
|
267 shows "finite {x. \<exists>A \<subseteq> B. P x A}" |
|
268 by (metis (no_types) assms finite_Collect_bounded_ex finite_Collect_subsets) |
|
269 |
|
270 text\<open>There are as many subsets of @{term A} having cardinality @{term k} |
|
271 as there are sets obtained from the former by inserting a fixed element |
|
272 @{term x} into each.\<close> |
|
273 lemma constr_bij: |
|
274 "finite A \<Longrightarrow> x \<notin> A \<Longrightarrow> |
|
275 card {B. \<exists>C. C \<subseteq> A \<and> card C = k \<and> B = insert x C} = |
|
276 card {B. B \<subseteq> A & card(B) = k}" |
|
277 apply (rule card_bij_eq [where f = "\<lambda>s. s - {x}" and g = "insert x"]) |
|
278 apply (auto elim!: equalityE simp add: inj_on_def) |
|
279 apply (metis card_Diff_singleton_if finite_subset in_mono) |
|
280 done |
|
281 |
|
282 text \<open> |
|
283 Main theorem: combinatorial statement about number of subsets of a set. |
|
284 \<close> |
|
285 |
|
286 theorem n_subsets: "finite A \<Longrightarrow> card {B. B \<subseteq> A \<and> card B = k} = (card A choose k)" |
|
287 proof (induct k arbitrary: A) |
|
288 case 0 then show ?case by (simp add: card_s_0_eq_empty) |
|
289 next |
|
290 case (Suc k) |
|
291 show ?case using \<open>finite A\<close> |
|
292 proof (induct A) |
|
293 case empty show ?case by (simp add: card_s_0_eq_empty) |
|
294 next |
|
295 case (insert x A) |
|
296 then show ?case using Suc.hyps |
|
297 apply (simp add: card_s_0_eq_empty choose_deconstruct) |
|
298 apply (subst card_Un_disjoint) |
|
299 prefer 4 apply (force simp add: constr_bij) |
|
300 prefer 3 apply force |
|
301 prefer 2 apply (blast intro: finite_Pow_iff [THEN iffD2] |
|
302 finite_subset [of _ "Pow (insert x F)" for F]) |
|
303 apply (blast intro: finite_Pow_iff [THEN iffD2, THEN [2] finite_subset]) |
|
304 done |
|
305 qed |
|
306 qed |
|
307 |
317 |
308 |
318 |
309 subsection \<open>The binomial theorem (courtesy of Tobias Nipkow):\<close> |
319 subsection \<open>The binomial theorem (courtesy of Tobias Nipkow):\<close> |
310 |
320 |
311 text\<open>Avigad's version, generalized to any commutative ring\<close> |
321 text\<open>Avigad's version, generalized to any commutative ring\<close> |
410 assumes "n > 0" |
420 assumes "n > 0" |
411 shows "2 * (\<Sum>i\<le>n. if even i then of_nat (n choose i) else 0) = (2 ^ n :: 'a :: comm_ring_1)" |
421 shows "2 * (\<Sum>i\<le>n. if even i then of_nat (n choose i) else 0) = (2 ^ n :: 'a :: comm_ring_1)" |
412 proof - |
422 proof - |
413 have "2 ^ n = (\<Sum>i\<le>n. of_nat (n choose i)) + (\<Sum>i\<le>n. (-1) ^ i * of_nat (n choose i) :: 'a)" |
423 have "2 ^ n = (\<Sum>i\<le>n. of_nat (n choose i)) + (\<Sum>i\<le>n. (-1) ^ i * of_nat (n choose i) :: 'a)" |
414 using choose_row_sum[of n] |
424 using choose_row_sum[of n] |
415 by (simp add: choose_alternating_sum assms atLeast0AtMost of_nat_setsum[symmetric] of_nat_power) |
425 by (simp add: choose_alternating_sum assms atLeast0AtMost of_nat_setsum[symmetric]) |
416 also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) + (-1) ^ i * of_nat (n choose i))" |
426 also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) + (-1) ^ i * of_nat (n choose i))" |
417 by (simp add: setsum.distrib) |
427 by (simp add: setsum.distrib) |
418 also have "\<dots> = 2 * (\<Sum>i\<le>n. if even i then of_nat (n choose i) else 0)" |
428 also have "\<dots> = 2 * (\<Sum>i\<le>n. if even i then of_nat (n choose i) else 0)" |
419 by (subst setsum_right_distrib, intro setsum.cong) simp_all |
429 by (subst setsum_right_distrib, intro setsum.cong) simp_all |
420 finally show ?thesis .. |
430 finally show ?thesis .. |
424 assumes "n > 0" |
434 assumes "n > 0" |
425 shows "2 * (\<Sum>i\<le>n. if odd i then of_nat (n choose i) else 0) = (2 ^ n :: 'a :: comm_ring_1)" |
435 shows "2 * (\<Sum>i\<le>n. if odd i then of_nat (n choose i) else 0) = (2 ^ n :: 'a :: comm_ring_1)" |
426 proof - |
436 proof - |
427 have "2 ^ n = (\<Sum>i\<le>n. of_nat (n choose i)) - (\<Sum>i\<le>n. (-1) ^ i * of_nat (n choose i) :: 'a)" |
437 have "2 ^ n = (\<Sum>i\<le>n. of_nat (n choose i)) - (\<Sum>i\<le>n. (-1) ^ i * of_nat (n choose i) :: 'a)" |
428 using choose_row_sum[of n] |
438 using choose_row_sum[of n] |
429 by (simp add: choose_alternating_sum assms atLeast0AtMost of_nat_setsum[symmetric] of_nat_power) |
439 by (simp add: choose_alternating_sum assms atLeast0AtMost of_nat_setsum[symmetric]) |
430 also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) - (-1) ^ i * of_nat (n choose i))" |
440 also have "\<dots> = (\<Sum>i\<le>n. of_nat (n choose i) - (-1) ^ i * of_nat (n choose i))" |
431 by (simp add: setsum_subtractf) |
441 by (simp add: setsum_subtractf) |
432 also have "\<dots> = 2 * (\<Sum>i\<le>n. if odd i then of_nat (n choose i) else 0)" |
442 also have "\<dots> = 2 * (\<Sum>i\<le>n. if odd i then of_nat (n choose i) else 0)" |
433 by (subst setsum_right_distrib, intro setsum.cong) simp_all |
443 by (subst setsum_right_distrib, intro setsum.cong) simp_all |
434 finally show ?thesis .. |
444 finally show ?thesis .. |
473 |
483 |
474 lemma pochhammer_Suc_setprod: "pochhammer a (Suc n) = setprod (\<lambda>n. a + of_nat n) {0 .. n}" |
484 lemma pochhammer_Suc_setprod: "pochhammer a (Suc n) = setprod (\<lambda>n. a + of_nat n) {0 .. n}" |
475 by (simp add: pochhammer_def) |
485 by (simp add: pochhammer_def) |
476 |
486 |
477 lemma pochhammer_of_nat: "pochhammer (of_nat x) n = of_nat (pochhammer x n)" |
487 lemma pochhammer_of_nat: "pochhammer (of_nat x) n = of_nat (pochhammer x n)" |
478 by (simp add: pochhammer_def of_nat_setprod) |
488 by (simp add: pochhammer_def) |
479 |
489 |
480 lemma pochhammer_of_int: "pochhammer (of_int x) n = of_int (pochhammer x n)" |
490 lemma pochhammer_of_int: "pochhammer (of_int x) n = of_int (pochhammer x n)" |
481 by (simp add: pochhammer_def of_int_setprod) |
491 by (simp add: pochhammer_def) |
482 |
492 |
483 lemma setprod_nat_ivl_Suc: "setprod f {0 .. Suc n} = setprod f {0..n} * f (Suc n)" |
493 lemma setprod_nat_ivl_Suc: "setprod f {0 .. Suc n} = setprod f {0..n} * f (Suc n)" |
484 proof - |
494 proof - |
485 have "{0..Suc n} = {0..n} \<union> {Suc n}" by auto |
495 have "{0..Suc n} = {0..n} \<union> {Suc n}" by auto |
486 then show ?thesis by (simp add: field_simps) |
496 then show ?thesis by (simp add: field_simps) |
535 qed simp_all |
545 qed simp_all |
536 |
546 |
537 lemma pochhammer_fact: "fact n = pochhammer 1 n" |
547 lemma pochhammer_fact: "fact n = pochhammer 1 n" |
538 unfolding fact_altdef |
548 unfolding fact_altdef |
539 apply (cases n) |
549 apply (cases n) |
540 apply (simp_all add: of_nat_setprod pochhammer_Suc_setprod) |
550 apply (simp_all add: pochhammer_Suc_setprod) |
541 apply (rule setprod.reindex_cong [where l = Suc]) |
551 apply (rule setprod.reindex_cong [where l = Suc]) |
542 apply (auto simp add: fun_eq_iff) |
552 apply (auto simp add: fun_eq_iff) |
543 done |
553 done |
544 |
554 |
545 lemma pochhammer_of_nat_eq_0_lemma: |
555 lemma pochhammer_of_nat_eq_0_lemma: |
647 have "pochhammer z (Suc n') * pochhammer (z + 1 / 2) (Suc n') = |
657 have "pochhammer z (Suc n') * pochhammer (z + 1 / 2) (Suc n') = |
648 (pochhammer z n' * pochhammer (z + 1 / 2) n') * |
658 (pochhammer z n' * pochhammer (z + 1 / 2) n') * |
649 ((z + of_nat n') * (z + 1/2 + of_nat n'))" (is "_ = _ * ?A") |
659 ((z + of_nat n') * (z + 1/2 + of_nat n'))" (is "_ = _ * ?A") |
650 by (simp_all add: pochhammer_rec' mult_ac) |
660 by (simp_all add: pochhammer_rec' mult_ac) |
651 also have "?A = (z + of_nat (Suc (2 * n + 1)) / 2) * (z + of_nat (Suc (Suc (2 * n + 1))) / 2)" |
661 also have "?A = (z + of_nat (Suc (2 * n + 1)) / 2) * (z + of_nat (Suc (Suc (2 * n + 1))) / 2)" |
652 (is "_ = ?A") by (simp add: field_simps n'_def of_nat_mult) |
662 (is "_ = ?A") by (simp add: field_simps n'_def) |
653 also note Suc[folded n'_def] |
663 also note Suc[folded n'_def] |
654 also have "(\<Prod>k = 0..2 * n + 1. z + of_nat k / 2) * ?A = (\<Prod>k = 0..2 * Suc n + 1. z + of_nat k / 2)" |
664 also have "(\<Prod>k = 0..2 * n + 1. z + of_nat k / 2) * ?A = (\<Prod>k = 0..2 * Suc n + 1. z + of_nat k / 2)" |
655 by (simp add: setprod_nat_ivl_Suc) |
665 by (simp add: setprod_nat_ivl_Suc) |
656 finally show ?case by (simp add: n'_def) |
666 finally show ?case by (simp add: n'_def) |
657 qed (simp add: setprod_nat_ivl_Suc) |
667 qed (simp add: setprod_nat_ivl_Suc) |
661 shows "pochhammer (2 * z) (2 * n) = of_nat (2^(2*n)) * pochhammer z n * pochhammer (z+1/2) n" |
671 shows "pochhammer (2 * z) (2 * n) = of_nat (2^(2*n)) * pochhammer z n * pochhammer (z+1/2) n" |
662 proof (induction n) |
672 proof (induction n) |
663 case (Suc n) |
673 case (Suc n) |
664 have "pochhammer (2 * z) (2 * (Suc n)) = pochhammer (2 * z) (2 * n) * |
674 have "pochhammer (2 * z) (2 * (Suc n)) = pochhammer (2 * z) (2 * n) * |
665 (2 * (z + of_nat n)) * (2 * (z + of_nat n) + 1)" |
675 (2 * (z + of_nat n)) * (2 * (z + of_nat n) + 1)" |
666 by (simp add: pochhammer_rec' ac_simps of_nat_mult) |
676 by (simp add: pochhammer_rec' ac_simps) |
667 also note Suc |
677 also note Suc |
668 also have "of_nat (2 ^ (2 * n)) * pochhammer z n * pochhammer (z + 1/2) n * |
678 also have "of_nat (2 ^ (2 * n)) * pochhammer z n * pochhammer (z + 1/2) n * |
669 (2 * (z + of_nat n)) * (2 * (z + of_nat n) + 1) = |
679 (2 * (z + of_nat n)) * (2 * (z + of_nat n) + 1) = |
670 of_nat (2 ^ (2 * (Suc n))) * pochhammer z (Suc n) * pochhammer (z + 1/2) (Suc n)" |
680 of_nat (2 ^ (2 * (Suc n))) * pochhammer z (Suc n) * pochhammer (z + 1/2) (Suc n)" |
671 by (simp add: of_nat_mult field_simps pochhammer_rec') |
681 by (simp add: field_simps pochhammer_rec') |
672 finally show ?case . |
682 finally show ?case . |
673 qed simp |
683 qed simp |
674 |
684 |
675 lemma fact_double: |
685 lemma fact_double: |
676 "fact (2 * n) = (2 ^ (2 * n) * pochhammer (1 / 2) n * fact n :: 'a :: field_char_0)" |
686 "fact (2 * n) = (2 ^ (2 * n) * pochhammer (1 / 2) n * fact n :: 'a :: field_char_0)" |
743 from eq[symmetric] |
753 from eq[symmetric] |
744 have ?thesis using kn |
754 have ?thesis using kn |
745 apply (simp add: binomial_fact[OF kn, where ?'a = 'a] |
755 apply (simp add: binomial_fact[OF kn, where ?'a = 'a] |
746 gbinomial_pochhammer field_simps pochhammer_Suc_setprod) |
756 gbinomial_pochhammer field_simps pochhammer_Suc_setprod) |
747 apply (simp add: pochhammer_Suc_setprod fact_altdef h |
757 apply (simp add: pochhammer_Suc_setprod fact_altdef h |
748 of_nat_setprod setprod.distrib[symmetric] eq' del: One_nat_def power_Suc) |
758 setprod.distrib[symmetric] eq' del: One_nat_def power_Suc) |
749 unfolding setprod.union_disjoint[OF th0, unfolded eq3, of "of_nat:: nat \<Rightarrow> 'a"] eq[unfolded h] |
759 unfolding setprod.union_disjoint[OF th0, unfolded eq3, of "of_nat:: nat \<Rightarrow> 'a"] eq[unfolded h] |
750 unfolding mult.assoc |
760 unfolding mult.assoc |
751 unfolding setprod.distrib[symmetric] |
761 unfolding setprod.distrib[symmetric] |
752 apply simp |
762 apply simp |
753 apply (intro setprod.reindex_bij_witness[where i="op - n" and j="op - n"]) |
763 apply (intro setprod.reindex_bij_witness[where i="op - n" and j="op - n"]) |
770 shows "a * (a gchoose n) = |
780 shows "a * (a gchoose n) = |
771 of_nat n * (a gchoose n) + of_nat (Suc n) * (a gchoose (Suc n))" (is "?l = ?r") |
781 of_nat n * (a gchoose n) + of_nat (Suc n) * (a gchoose (Suc n))" (is "?l = ?r") |
772 proof - |
782 proof - |
773 have "?r = ((- 1) ^n * pochhammer (- a) n / (fact n)) * (of_nat n - (- a + of_nat n))" |
783 have "?r = ((- 1) ^n * pochhammer (- a) n / (fact n)) * (of_nat n - (- a + of_nat n))" |
774 unfolding gbinomial_pochhammer |
784 unfolding gbinomial_pochhammer |
775 pochhammer_Suc of_nat_mult right_diff_distrib power_Suc |
785 pochhammer_Suc right_diff_distrib power_Suc |
776 apply (simp del: of_nat_Suc fact.simps) |
786 apply (simp del: of_nat_Suc fact.simps) |
777 apply (auto simp add: field_simps simp del: of_nat_Suc) |
787 apply (auto simp add: field_simps simp del: of_nat_Suc) |
778 done |
788 done |
779 also have "\<dots> = ?l" unfolding gbinomial_pochhammer |
789 also have "\<dots> = ?l" unfolding gbinomial_pochhammer |
780 by (simp add: field_simps) |
790 by (simp add: field_simps) |
902 case (Suc m) |
912 case (Suc m) |
903 with assms have "m > 0" by simp |
913 with assms have "m > 0" by simp |
904 have "(\<Sum>i\<le>n. (-1) ^ i * of_nat i * of_nat (n choose i) :: 'a) = |
914 have "(\<Sum>i\<le>n. (-1) ^ i * of_nat i * of_nat (n choose i) :: 'a) = |
905 (\<Sum>i\<le>Suc m. (-1) ^ i * of_nat i * of_nat (Suc m choose i))" by (simp add: Suc) |
915 (\<Sum>i\<le>Suc m. (-1) ^ i * of_nat i * of_nat (Suc m choose i))" by (simp add: Suc) |
906 also have "... = (\<Sum>i\<le>m. (-1) ^ (Suc i) * of_nat (Suc i * (Suc m choose Suc i)))" |
916 also have "... = (\<Sum>i\<le>m. (-1) ^ (Suc i) * of_nat (Suc i * (Suc m choose Suc i)))" |
907 by (simp only: setsum_atMost_Suc_shift setsum_right_distrib[symmetric] of_nat_mult mult_ac) simp |
917 by (simp only: setsum_atMost_Suc_shift setsum_right_distrib[symmetric] mult_ac of_nat_mult) simp |
908 also have "... = -of_nat (Suc m) * (\<Sum>i\<le>m. (-1) ^ i * of_nat ((m choose i)))" |
918 also have "... = -of_nat (Suc m) * (\<Sum>i\<le>m. (-1) ^ i * of_nat ((m choose i)))" |
909 by (subst setsum_right_distrib, rule setsum.cong[OF refl], subst Suc_times_binomial) |
919 by (subst setsum_right_distrib, rule setsum.cong[OF refl], subst Suc_times_binomial) |
910 (simp add: algebra_simps of_nat_mult) |
920 (simp add: algebra_simps) |
911 also have "(\<Sum>i\<le>m. (-1 :: 'a) ^ i * of_nat ((m choose i))) = 0" |
921 also have "(\<Sum>i\<le>m. (-1 :: 'a) ^ i * of_nat ((m choose i))) = 0" |
912 using choose_alternating_sum[OF \<open>m > 0\<close>] by simp |
922 using choose_alternating_sum[OF \<open>m > 0\<close>] by simp |
913 finally show ?thesis by simp |
923 finally show ?thesis by simp |
914 qed simp |
924 qed simp |
915 |
925 |
992 from assms have "x * of_nat i \<ge> of_nat (i * k)" |
1002 from assms have "x * of_nat i \<ge> of_nat (i * k)" |
993 by (metis mult.commute mult_le_cancel_right of_nat_less_0_iff of_nat_mult) |
1003 by (metis mult.commute mult_le_cancel_right of_nat_less_0_iff of_nat_mult) |
994 then have "x * of_nat k - x * of_nat i \<le> x * of_nat k - of_nat (i * k)" by arith |
1004 then have "x * of_nat k - x * of_nat i \<le> x * of_nat k - of_nat (i * k)" by arith |
995 then have "x * of_nat (k - i) \<le> (x - of_nat i) * of_nat k" |
1005 then have "x * of_nat (k - i) \<le> (x - of_nat i) * of_nat k" |
996 using ik |
1006 using ik |
997 by (simp add: algebra_simps zero_less_mult_iff of_nat_diff of_nat_mult) |
1007 by (simp add: algebra_simps zero_less_mult_iff of_nat_diff) |
998 then have "x * of_nat (k - i) \<le> (x - of_nat i) * (of_nat k :: 'a)" |
1008 then have "x * of_nat (k - i) \<le> (x - of_nat i) * (of_nat k :: 'a)" |
999 unfolding of_nat_mult[symmetric] of_nat_le_iff . |
1009 unfolding of_nat_mult[symmetric] of_nat_le_iff . |
1000 with assms show "x / of_nat k \<le> (x - of_nat i) / (of_nat (k - i) :: 'a)" |
1010 with assms show "x / of_nat k \<le> (x - of_nat i) / (of_nat (k - i) :: 'a)" |
1001 using \<open>i < k\<close> by (simp add: field_simps) |
1011 using \<open>i < k\<close> by (simp add: field_simps) |
1002 qed (simp add: x zero_le_divide_iff) |
1012 qed (simp add: x zero_le_divide_iff) |
1250 |
1260 |
1251 lemma gbinomial_r_part_sum: |
1261 lemma gbinomial_r_part_sum: |
1252 "(\<Sum>k\<le>m. (2 * (of_nat m) + 1 gchoose k)) = 2 ^ (2 * m)" (is "?lhs = ?rhs") |
1262 "(\<Sum>k\<le>m. (2 * (of_nat m) + 1 gchoose k)) = 2 ^ (2 * m)" (is "?lhs = ?rhs") |
1253 proof - |
1263 proof - |
1254 have "?lhs = of_nat (\<Sum>k\<le>m. (2 * m + 1) choose k)" |
1264 have "?lhs = of_nat (\<Sum>k\<le>m. (2 * m + 1) choose k)" |
1255 by (simp add: binomial_gbinomial of_nat_mult add_ac of_nat_setsum) |
1265 by (simp add: binomial_gbinomial add_ac) |
1256 also have "\<dots> = of_nat (2 ^ (2 * m))" by (subst binomial_r_part_sum) (rule refl) |
1266 also have "\<dots> = of_nat (2 ^ (2 * m))" by (subst binomial_r_part_sum) (rule refl) |
1257 finally show ?thesis by (simp add: of_nat_power) |
1267 finally show ?thesis by simp |
1258 qed |
1268 qed |
1259 |
1269 |
1260 lemma gbinomial_sum_nat_pow2: |
1270 lemma gbinomial_sum_nat_pow2: |
1261 "(\<Sum>k\<le>m. (of_nat (m + k) gchoose k :: 'a :: field_char_0) / 2 ^ k) = 2 ^ m" (is "?lhs = ?rhs") |
1271 "(\<Sum>k\<le>m. (of_nat (m + k) gchoose k :: 'a :: field_char_0) / 2 ^ k) = 2 ^ m" (is "?lhs = ?rhs") |
1262 proof - |
1272 proof - |
1314 |
1324 |
1315 lemma choose_dvd: "k \<le> n \<Longrightarrow> fact k * fact (n - k) dvd (fact n :: 'a :: {semiring_div,linordered_semidom})" |
1325 lemma choose_dvd: "k \<le> n \<Longrightarrow> fact k * fact (n - k) dvd (fact n :: 'a :: {semiring_div,linordered_semidom})" |
1316 unfolding dvd_def |
1326 unfolding dvd_def |
1317 apply (rule exI [where x="of_nat (n choose k)"]) |
1327 apply (rule exI [where x="of_nat (n choose k)"]) |
1318 using binomial_fact_lemma [of k n, THEN arg_cong [where f = of_nat and 'b='a]] |
1328 using binomial_fact_lemma [of k n, THEN arg_cong [where f = of_nat and 'b='a]] |
1319 apply (auto simp: of_nat_mult) |
1329 apply auto |
1320 done |
1330 done |
1321 |
1331 |
1322 lemma fact_fact_dvd_fact: |
1332 lemma fact_fact_dvd_fact: |
1323 "fact k * fact n dvd (fact (k+n) :: 'a :: {semiring_div,linordered_semidom})" |
1333 "fact k * fact n dvd (fact (k+n) :: 'a :: {semiring_div,linordered_semidom})" |
1324 by (metis add.commute add_diff_cancel_left' choose_dvd le_add2) |
1334 by (metis add.commute add_diff_cancel_left' choose_dvd le_add2) |
1556 finally show ?thesis |
1566 finally show ?thesis |
1557 by (subst (1 2) binomial_altdef_nat) |
1567 by (subst (1 2) binomial_altdef_nat) |
1558 (simp_all only: ac_simps diff_Suc_Suc Suc_diff_le diff_add_inverse fact_Suc of_nat_id) |
1568 (simp_all only: ac_simps diff_Suc_Suc Suc_diff_le diff_add_inverse fact_Suc of_nat_id) |
1559 qed |
1569 qed |
1560 |
1570 |
1561 |
|
1562 |
|
1563 lemma fact_code [code]: |
1571 lemma fact_code [code]: |
1564 "fact n = (of_nat (fold_atLeastAtMost_nat (op *) 2 n 1) :: 'a :: semiring_char_0)" |
1572 "fact n = (of_nat (fold_atLeastAtMost_nat (op *) 2 n 1) :: 'a :: semiring_char_0)" |
1565 proof - |
1573 proof - |
1566 have "fact n = (of_nat (\<Prod>{1..n}) :: 'a)" by (simp add: fact_altdef') |
1574 have "fact n = (of_nat (\<Prod>{1..n}) :: 'a)" by (simp add: fact_altdef') |
1567 also have "\<Prod>{1..n} = \<Prod>{2..n}" |
1575 also have "\<Prod>{1..n} = \<Prod>{2..n}" |