| author | wenzelm | 
| Wed, 09 Nov 2005 16:26:49 +0100 | |
| changeset 18134 | 6450591da9f0 | 
| parent 15402 | 97204f3b4705 | 
| child 18369 | 694ea14ab4f2 | 
| permissions | -rw-r--r-- | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 1 | (* Title: HOL/Quadratic_Reciprocity/Finite2.thy | 
| 14981 | 2 | ID: $Id$ | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 3 | Authors: Jeremy Avigad, David Gray, and Adam Kramer | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 4 | *) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 5 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 6 | header {*Finite Sets and Finite Sums*}
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 7 | |
| 15392 | 8 | theory Finite2 | 
| 9 | imports IntFact | |
| 10 | begin | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 11 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 12 | text{*These are useful for combinatorial and number-theoretic counting
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 13 | arguments.*} | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 14 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 15 | text{*Note.  This theory is being revised.  See the web page
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 16 | \url{http://www.andrew.cmu.edu/~avigad/isabelle}.*}
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 17 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 18 | (******************************************************************) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 19 | (* *) | 
| 15392 | 20 | (* Useful properties of sums and products *) | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 21 | (* *) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 22 | (******************************************************************) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 23 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 24 | subsection {* Useful properties of sums and products *}
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 25 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 26 | lemma setsum_same_function_zcong: | 
| 15392 | 27 | assumes a: "\<forall>x \<in> S. [f x = g x](mod m)" | 
| 28 | shows "[setsum f S = setsum g S] (mod m)" | |
| 29 | proof cases | |
| 30 | assume "finite S" | |
| 31 | thus ?thesis using a by induct (simp_all add: zcong_zadd) | |
| 32 | next | |
| 33 | assume "infinite S" thus ?thesis by(simp add:setsum_def) | |
| 34 | qed | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 35 | |
| 15392 | 36 | lemma setprod_same_function_zcong: | 
| 37 | assumes a: "\<forall>x \<in> S. [f x = g x](mod m)" | |
| 38 | shows "[setprod f S = setprod g S] (mod m)" | |
| 39 | proof cases | |
| 40 | assume "finite S" | |
| 41 | thus ?thesis using a by induct (simp_all add: zcong_zmult) | |
| 42 | next | |
| 43 | assume "infinite S" thus ?thesis by(simp add:setprod_def) | |
| 44 | qed | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 45 | |
| 15392 | 46 | lemma setsum_const: "finite X ==> setsum (%x. (c :: int)) X = c * int(card X)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 47 | apply (induct set: Finites) | 
| 15047 | 48 | apply (auto simp add: left_distrib right_distrib int_eq_of_nat) | 
| 49 | done | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 50 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 51 | lemma setsum_const2: "finite X ==> int (setsum (%x. (c :: nat)) X) = | 
| 15392 | 52 | int(c) * int(card X)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 53 | apply (induct set: Finites) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 54 | apply (auto simp add: zadd_zmult_distrib2) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 55 | done | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 56 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 57 | lemma setsum_const_mult: "finite A ==> setsum (%x. c * ((f x)::int)) A = | 
| 15392 | 58 | c * setsum f A" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 59 | apply (induct set: Finites, auto) | 
| 15392 | 60 | by (auto simp only: zadd_zmult_distrib2) | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 61 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 62 | (******************************************************************) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 63 | (* *) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 64 | (* Cardinality of some explicit finite sets *) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 65 | (* *) | 
| 15392 | 66 | (******************************************************************) | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 67 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 68 | subsection {* Cardinality of explicit finite sets *}
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 69 | |
| 15392 | 70 | lemma finite_surjI: "[| B \<subseteq> f ` A; finite A |] ==> finite B" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 71 | by (simp add: finite_subset finite_imageI) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 72 | |
| 15392 | 73 | lemma bdd_nat_set_l_finite: "finite { y::nat . y < x}"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 74 | apply (rule_tac N = "{y. y < x}" and n = x in bounded_nat_set_is_finite)
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 75 | by auto | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 76 | |
| 15392 | 77 | lemma bdd_nat_set_le_finite: "finite { y::nat . y \<le> x  }"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 78 | apply (subgoal_tac "{ y::nat . y \<le> x  } = { y::nat . y < Suc x}")
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 79 | by (auto simp add: bdd_nat_set_l_finite) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 80 | |
| 15392 | 81 | lemma  bdd_int_set_l_finite: "finite { x::int . 0 \<le> x & x < n}"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 82 | apply (subgoal_tac " {(x :: int). 0 \<le> x & x < n} \<subseteq> 
 | 
| 15392 | 83 |     int ` {(x :: nat). x < nat n}")
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 84 | apply (erule finite_surjI) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 85 | apply (auto simp add: bdd_nat_set_l_finite image_def) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 86 | apply (rule_tac x = "nat x" in exI, simp) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 87 | done | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 88 | |
| 15392 | 89 | lemma bdd_int_set_le_finite: "finite {x::int. 0 \<le> x & x \<le> n}"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 90 | apply (subgoal_tac "{x. 0 \<le> x & x \<le> n} = {x. 0 \<le> x & x < n + 1}")
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 91 | apply (erule ssubst) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 92 | apply (rule bdd_int_set_l_finite) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 93 | by auto | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 94 | |
| 15392 | 95 | lemma bdd_int_set_l_l_finite: "finite {x::int. 0 < x & x < n}"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 96 | apply (subgoal_tac "{x::int. 0 < x & x < n} \<subseteq> {x::int. 0 \<le> x & x < n}")
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 97 | by (auto simp add: bdd_int_set_l_finite finite_subset) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 98 | |
| 15392 | 99 | lemma bdd_int_set_l_le_finite: "finite {x::int. 0 < x & x \<le> n}"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 100 | apply (subgoal_tac "{x::int. 0 < x & x \<le> n} \<subseteq> {x::int. 0 \<le> x & x \<le> n}")
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 101 | by (auto simp add: bdd_int_set_le_finite finite_subset) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 102 | |
| 15392 | 103 | lemma card_bdd_nat_set_l: "card {y::nat . y < x} = x"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 104 | apply (induct_tac x, force) | 
| 15392 | 105 | proof - | 
| 106 | fix n::nat | |
| 107 |   assume "card {y. y < n} = n" 
 | |
| 108 |   have "{y. y < Suc n} = insert n {y. y < n}"
 | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 109 | by auto | 
| 15392 | 110 |   then have "card {y. y < Suc n} = card (insert n {y. y < n})"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 111 | by auto | 
| 15392 | 112 |   also have "... = Suc (card {y. y < n})"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 113 | apply (rule card_insert_disjoint) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 114 | by (auto simp add: bdd_nat_set_l_finite) | 
| 15392 | 115 |   finally show "card {y. y < Suc n} = Suc n" 
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 116 | by (simp add: prems) | 
| 15392 | 117 | qed | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 118 | |
| 15392 | 119 | lemma card_bdd_nat_set_le: "card { y::nat. y \<le> x} = Suc x"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 120 | apply (subgoal_tac "{ y::nat. y \<le> x} = { y::nat. y < Suc x}")
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 121 | by (auto simp add: card_bdd_nat_set_l) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 122 | |
| 15392 | 123 | lemma card_bdd_int_set_l: "0 \<le> (n::int) ==> card {y. 0 \<le> y & y < n} = nat n"
 | 
| 124 | proof - | |
| 125 | fix n::int | |
| 126 | assume "0 \<le> n" | |
| 15402 | 127 |   have "inj_on (%y. int y) {y. y < nat n}"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 128 | by (auto simp add: inj_on_def) | 
| 15402 | 129 |   hence "card (int ` {y. y < nat n}) = card {y. y < nat n}"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 130 | by (rule card_image) | 
| 15392 | 131 |   also from prems have "int ` {y. y < nat n} = {y. 0 \<le> y & y < n}"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 132 | apply (auto simp add: zless_nat_eq_int_zless image_def) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 133 | apply (rule_tac x = "nat x" in exI) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 134 | by (auto simp add: nat_0_le) | 
| 15392 | 135 |   also have "card {y. y < nat n} = nat n" 
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 136 | by (rule card_bdd_nat_set_l) | 
| 15392 | 137 |   finally show "card {y. 0 \<le> y & y < n} = nat n" .
 | 
| 138 | qed | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 139 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 140 | lemma card_bdd_int_set_le: "0 \<le> (n::int) ==> card {y. 0 \<le> y & y \<le> n} = 
 | 
| 15392 | 141 | nat n + 1" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 142 | apply (subgoal_tac "{y. 0 \<le> y & y \<le> n} = {y. 0 \<le> y & y < n+1}")
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 143 | apply (insert card_bdd_int_set_l [of "n+1"]) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 144 | by (auto simp add: nat_add_distrib) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 145 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 146 | lemma card_bdd_int_set_l_le: "0 \<le> (n::int) ==> | 
| 15392 | 147 |     card {x. 0 < x & x \<le> n} = nat n"
 | 
| 148 | proof - | |
| 149 | fix n::int | |
| 150 | assume "0 \<le> n" | |
| 15402 | 151 |   have "inj_on (%x. x+1) {x. 0 \<le> x & x < n}"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 152 | by (auto simp add: inj_on_def) | 
| 15402 | 153 |   hence "card ((%x. x+1) ` {x. 0 \<le> x & x < n}) = 
 | 
| 15392 | 154 |      card {x. 0 \<le> x & x < n}"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 155 | by (rule card_image) | 
| 15392 | 156 | also from prems have "... = nat n" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 157 | by (rule card_bdd_int_set_l) | 
| 15392 | 158 |   also have "(%x. x + 1) ` {x. 0 \<le> x & x < n} = {x. 0 < x & x<= n}"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 159 | apply (auto simp add: image_def) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 160 | apply (rule_tac x = "x - 1" in exI) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 161 | by arith | 
| 15392 | 162 |   finally show "card {x. 0 < x & x \<le> n} = nat n".
 | 
| 163 | qed | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 164 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 165 | lemma card_bdd_int_set_l_l: "0 < (n::int) ==> | 
| 15392 | 166 |     card {x. 0 < x & x < n} = nat n - 1"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 167 |   apply (subgoal_tac "{x. 0 < x & x < n} = {x. 0 < x & x \<le> n - 1}")
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 168 | apply (insert card_bdd_int_set_l_le [of "n - 1"]) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 169 | by (auto simp add: nat_diff_distrib) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 170 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 171 | lemma int_card_bdd_int_set_l_l: "0 < n ==> | 
| 15392 | 172 |     int(card {x. 0 < x & x < n}) = n - 1"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 173 | apply (auto simp add: card_bdd_int_set_l_l) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 174 | apply (subgoal_tac "Suc 0 \<le> nat n") | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 175 | apply (auto simp add: zdiff_int [THEN sym]) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 176 | apply (subgoal_tac "0 < nat n", arith) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 177 | by (simp add: zero_less_nat_eq) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 178 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 179 | lemma int_card_bdd_int_set_l_le: "0 \<le> n ==> | 
| 15392 | 180 |     int(card {x. 0 < x & x \<le> n}) = n"
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 181 | by (auto simp add: card_bdd_int_set_l_le) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 182 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 183 | (******************************************************************) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 184 | (* *) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 185 | (* Cartesian products of finite sets *) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 186 | (* *) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 187 | (******************************************************************) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 188 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 189 | subsection {* Cardinality of finite cartesian products *}
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 190 | |
| 15402 | 191 | (* FIXME could be useful in general but not needed here | 
| 192 | lemma insert_Sigma [simp]: "(insert x A) <*> B = ({ x } <*> B) \<union> (A <*> B)"
 | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 193 | by blast | 
| 15402 | 194 | *) | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 195 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 196 | (******************************************************************) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 197 | (* *) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 198 | (* Sums and products over finite sets *) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 199 | (* *) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 200 | (******************************************************************) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 201 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 202 | subsection {* Lemmas for counting arguments *}
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 203 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 204 | lemma setsum_bij_eq: "[| finite A; finite B; f ` A \<subseteq> B; inj_on f A; | 
| 15392 | 205 | g ` B \<subseteq> A; inj_on g B |] ==> setsum g B = setsum (g \<circ> f) A" | 
| 206 | apply (frule_tac h = g and f = f in setsum_reindex) | |
| 207 | apply (subgoal_tac "setsum g B = setsum g (f ` A)") | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 208 | apply (simp add: inj_on_def) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 209 | apply (subgoal_tac "card A = card B") | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 210 | apply (drule_tac A = "f ` A" and B = B in card_seteq) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 211 | apply (auto simp add: card_image) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 212 | apply (frule_tac A = A and B = B and f = f in card_inj_on_le, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 213 | apply (frule_tac A = B and B = A and f = g in card_inj_on_le) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 214 | by auto | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 215 | |
| 15392 | 216 | lemma setprod_bij_eq: "[| finite A; finite B; f ` A \<subseteq> B; inj_on f A; | 
| 217 | g ` B \<subseteq> A; inj_on g B |] ==> setprod g B = setprod (g \<circ> f) A" | |
| 218 | apply (frule_tac h = g and f = f in setprod_reindex) | |
| 219 | apply (subgoal_tac "setprod g B = setprod g (f ` A)") | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 220 | apply (simp add: inj_on_def) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 221 | apply (subgoal_tac "card A = card B") | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 222 | apply (drule_tac A = "f ` A" and B = B in card_seteq) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 223 | apply (auto simp add: card_image) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 224 | apply (frule_tac A = A and B = B and f = f in card_inj_on_le, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 225 | by (frule_tac A = B and B = A and f = g in card_inj_on_le, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 226 | |
| 15392 | 227 | end |