| author | wenzelm | 
| Mon, 05 Jun 2006 21:54:21 +0200 | |
| changeset 19775 | 06cb6743adf6 | 
| parent 19670 | 2e4a143c73c5 | 
| child 20217 | 25b068a99d2b | 
| 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/Gauss.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 {*Integers: Divisibility and Congruences*}
 | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 7 | |
| 18369 | 8 | theory Int2 imports Finite2 WilsonRuss begin | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 9 | |
| 19670 | 10 | definition | 
| 11 | MultInv :: "int => int => int" | |
| 12 | "MultInv p x = x ^ nat (p - 2)" | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 13 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 14 | |
| 19670 | 15 | subsection {* Useful lemmas about dvd and powers *}
 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 16 | |
| 18369 | 17 | lemma zpower_zdvd_prop1: | 
| 18 | "0 < n \<Longrightarrow> p dvd y \<Longrightarrow> p dvd ((y::int) ^ n)" | |
| 19 | by (induct n) (auto simp add: zdvd_zmult zdvd_zmult2 [of p y]) | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 20 | |
| 18369 | 21 | lemma zdvd_bounds: "n dvd m ==> m \<le> (0::int) | n \<le> m" | 
| 22 | proof - | |
| 23 | assume "n dvd m" | |
| 24 | then have "~(0 < m & m < n)" | |
| 25 | using zdvd_not_zless [of m n] by auto | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 26 | then show ?thesis by auto | 
| 18369 | 27 | qed | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 28 | |
| 19670 | 29 | lemma zprime_zdvd_zmult_better: "[| zprime p; p dvd (m * n) |] ==> | 
| 18369 | 30 | (p dvd m) | (p dvd n)" | 
| 31 | apply (cases "0 \<le> m") | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 32 | apply (simp add: zprime_zdvd_zmult) | 
| 18369 | 33 | apply (insert zprime_zdvd_zmult [of "-m" p n]) | 
| 34 | apply auto | |
| 35 | done | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 36 | |
| 18369 | 37 | lemma zpower_zdvd_prop2: | 
| 38 | "zprime p \<Longrightarrow> p dvd ((y::int) ^ n) \<Longrightarrow> 0 < n \<Longrightarrow> p dvd y" | |
| 39 | apply (induct n) | |
| 40 | apply simp | |
| 41 | apply (frule zprime_zdvd_zmult_better) | |
| 42 | apply simp | |
| 43 | apply force | |
| 44 | done | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 45 | |
| 18369 | 46 | lemma div_prop1: "[| 0 < z; (x::int) < y * z |] ==> x div z < y" | 
| 47 | proof - | |
| 48 | assume "0 < z" | |
| 49 | then have "(x div z) * z \<le> (x div z) * z + x mod z" | |
| 50 | by arith | |
| 51 | also have "... = x" | |
| 52 | by (auto simp add: zmod_zdiv_equality [symmetric] zmult_ac) | |
| 53 | also assume "x < y * z" | |
| 54 | finally show ?thesis | |
| 14387 
e96d5c42c4b0
Polymorphic treatment of binary arithmetic using axclasses
 paulson parents: 
13871diff
changeset | 55 | by (auto simp add: prems mult_less_cancel_right, insert prems, arith) | 
| 18369 | 56 | qed | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 57 | |
| 18369 | 58 | lemma div_prop2: "[| 0 < z; (x::int) < (y * z) + z |] ==> x div z \<le> y" | 
| 59 | proof - | |
| 60 | assume "0 < z" and "x < (y * z) + z" | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 61 | then have "x < (y + 1) * z" by (auto simp add: int_distrib) | 
| 18369 | 62 | then have "x div z < y + 1" | 
| 63 | apply - | |
| 64 | apply (rule_tac y = "y + 1" in div_prop1) | |
| 65 | apply (auto simp add: prems) | |
| 66 | done | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 67 | then show ?thesis by auto | 
| 18369 | 68 | qed | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 69 | |
| 18369 | 70 | lemma zdiv_leq_prop: "[| 0 < y |] ==> y * (x div y) \<le> (x::int)" | 
| 71 | proof- | |
| 72 | assume "0 < y" | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 73 | from zmod_zdiv_equality have "x = y * (x div y) + x mod y" by auto | 
| 18369 | 74 | moreover have "0 \<le> x mod y" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 75 | by (auto simp add: prems pos_mod_sign) | 
| 18369 | 76 | ultimately show ?thesis | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 77 | by arith | 
| 18369 | 78 | qed | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 79 | |
| 19670 | 80 | |
| 81 | subsection {* Useful properties of congruences *}
 | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 82 | |
| 18369 | 83 | lemma zcong_eq_zdvd_prop: "[x = 0](mod p) = (p dvd x)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 84 | by (auto simp add: zcong_def) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 85 | |
| 18369 | 86 | lemma zcong_id: "[m = 0] (mod m)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 87 | by (auto simp add: zcong_def zdvd_0_right) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 88 | |
| 18369 | 89 | lemma zcong_shift: "[a = b] (mod m) ==> [a + c = b + c] (mod m)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 90 | by (auto simp add: zcong_refl zcong_zadd) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 91 | |
| 18369 | 92 | lemma zcong_zpower: "[x = y](mod m) ==> [x^z = y^z](mod m)" | 
| 93 | by (induct z) (auto simp add: zcong_zmult) | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 94 | |
| 19670 | 95 | lemma zcong_eq_trans: "[| [a = b](mod m); b = c; [c = d](mod m) |] ==> | 
| 18369 | 96 | [a = d](mod m)" | 
| 97 | apply (erule zcong_trans) | |
| 98 | apply simp | |
| 99 | done | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 100 | |
| 18369 | 101 | lemma aux1: "a - b = (c::int) ==> a = c + b" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 102 | by auto | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 103 | |
| 19670 | 104 | lemma zcong_zmult_prop1: "[a = b](mod m) ==> ([c = a * d](mod m) = | 
| 18369 | 105 | [c = b * d] (mod m))" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 106 | apply (auto simp add: zcong_def dvd_def) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 107 | apply (rule_tac x = "ka + k * d" in exI) | 
| 18369 | 108 | apply (drule aux1)+ | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 109 | apply (auto simp add: int_distrib) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 110 | apply (rule_tac x = "ka - k * d" in exI) | 
| 18369 | 111 | apply (drule aux1)+ | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 112 | apply (auto simp add: int_distrib) | 
| 18369 | 113 | done | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 114 | |
| 19670 | 115 | lemma zcong_zmult_prop2: "[a = b](mod m) ==> | 
| 18369 | 116 | ([c = d * a](mod m) = [c = d * b] (mod m))" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 117 | by (auto simp add: zmult_ac zcong_zmult_prop1) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 118 | |
| 19670 | 119 | lemma zcong_zmult_prop3: "[| zprime p; ~[x = 0] (mod p); | 
| 18369 | 120 | ~[y = 0] (mod p) |] ==> ~[x * y = 0] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 121 | apply (auto simp add: zcong_def) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 122 | apply (drule zprime_zdvd_zmult_better, auto) | 
| 18369 | 123 | done | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 124 | |
| 19670 | 125 | lemma zcong_less_eq: "[| 0 < x; 0 < y; 0 < m; [x = y] (mod m); | 
| 18369 | 126 | x < m; y < m |] ==> x = y" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 127 | apply (simp add: zcong_zmod_eq) | 
| 18369 | 128 | apply (subgoal_tac "(x mod m) = x") | 
| 129 | apply (subgoal_tac "(y mod m) = y") | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 130 | apply simp | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 131 | apply (rule_tac [1-2] mod_pos_pos_trivial) | 
| 18369 | 132 | apply auto | 
| 133 | done | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 134 | |
| 19670 | 135 | lemma zcong_neg_1_impl_ne_1: "[| 2 < p; [x = -1] (mod p) |] ==> | 
| 18369 | 136 | ~([x = 1] (mod p))" | 
| 137 | proof | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 138 | assume "2 < p" and "[x = 1] (mod p)" and "[x = -1] (mod p)" | 
| 18369 | 139 | then have "[1 = -1] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 140 | apply (auto simp add: zcong_sym) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 141 | apply (drule zcong_trans, auto) | 
| 18369 | 142 | done | 
| 143 | then have "[1 + 1 = -1 + 1] (mod p)" | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 144 | by (simp only: zcong_shift) | 
| 18369 | 145 | then have "[2 = 0] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 146 | by auto | 
| 18369 | 147 | then have "p dvd 2" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 148 | by (auto simp add: dvd_def zcong_def) | 
| 18369 | 149 | with prems show False | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 150 | by (auto simp add: zdvd_not_zless) | 
| 18369 | 151 | qed | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 152 | |
| 18369 | 153 | lemma zcong_zero_equiv_div: "[a = 0] (mod m) = (m dvd a)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 154 | by (auto simp add: zcong_def) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 155 | |
| 19670 | 156 | lemma zcong_zprime_prod_zero: "[| zprime p; 0 < a |] ==> | 
| 157 | [a * b = 0] (mod p) ==> [a = 0] (mod p) | [b = 0] (mod p)" | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 158 | by (auto simp add: zcong_zero_equiv_div zprime_zdvd_zmult) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 159 | |
| 16663 | 160 | lemma zcong_zprime_prod_zero_contra: "[| zprime p; 0 < a |] ==> | 
| 18369 | 161 | ~[a = 0](mod p) & ~[b = 0](mod p) ==> ~[a * b = 0] (mod p)" | 
| 19670 | 162 | apply auto | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 163 | apply (frule_tac a = a and b = b and p = p in zcong_zprime_prod_zero) | 
| 18369 | 164 | apply auto | 
| 165 | done | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 166 | |
| 19670 | 167 | lemma zcong_not_zero: "[| 0 < x; x < m |] ==> ~[x = 0] (mod m)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 168 | by (auto simp add: zcong_zero_equiv_div zdvd_not_zless) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 169 | |
| 18369 | 170 | lemma zcong_zero: "[| 0 \<le> x; x < m; [x = 0](mod m) |] ==> x = 0" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 171 | apply (drule order_le_imp_less_or_eq, auto) | 
| 18369 | 172 | apply (frule_tac m = m in zcong_not_zero) | 
| 173 | apply auto | |
| 174 | done | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 175 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 176 | lemma all_relprime_prod_relprime: "[| finite A; \<forall>x \<in> A. (zgcd(x,y) = 1) |] | 
| 18369 | 177 | ==> zgcd (setprod id A,y) = 1" | 
| 178 | by (induct set: Finites) (auto simp add: zgcd_zgcd_zmult) | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 179 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 180 | |
| 19670 | 181 | subsection {* Some properties of MultInv *}
 | 
| 182 | ||
| 183 | lemma MultInv_prop1: "[| 2 < p; [x = y] (mod p) |] ==> | |
| 18369 | 184 | [(MultInv p x) = (MultInv p y)] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 185 | by (auto simp add: MultInv_def zcong_zpower) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 186 | |
| 19670 | 187 | lemma MultInv_prop2: "[| 2 < p; zprime p; ~([x = 0](mod p)) |] ==> | 
| 18369 | 188 | [(x * (MultInv p x)) = 1] (mod p)" | 
| 189 | proof (simp add: MultInv_def zcong_eq_zdvd_prop) | |
| 190 | assume "2 < p" and "zprime p" and "~ p dvd x" | |
| 191 | have "x * x ^ nat (p - 2) = x ^ (nat (p - 2) + 1)" | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 192 | by auto | 
| 18369 | 193 | also from prems have "nat (p - 2) + 1 = nat (p - 2 + 1)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 194 | by (simp only: nat_add_distrib, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 195 | also have "p - 2 + 1 = p - 1" by arith | 
| 18369 | 196 | finally have "[x * x ^ nat (p - 2) = x ^ nat (p - 1)] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 197 | by (rule ssubst, auto) | 
| 18369 | 198 | also from prems have "[x ^ nat (p - 1) = 1] (mod p)" | 
| 19670 | 199 | by (auto simp add: Little_Fermat) | 
| 18369 | 200 | finally (zcong_trans) show "[x * x ^ nat (p - 2) = 1] (mod p)" . | 
| 201 | qed | |
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 202 | |
| 19670 | 203 | lemma MultInv_prop2a: "[| 2 < p; zprime p; ~([x = 0](mod p)) |] ==> | 
| 18369 | 204 | [(MultInv p x) * x = 1] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 205 | by (auto simp add: MultInv_prop2 zmult_ac) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 206 | |
| 18369 | 207 | lemma aux_1: "2 < p ==> ((nat p) - 2) = (nat (p - 2))" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 208 | by (simp add: nat_diff_distrib) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 209 | |
| 18369 | 210 | lemma aux_2: "2 < p ==> 0 < nat (p - 2)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 211 | by auto | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 212 | |
| 19670 | 213 | lemma MultInv_prop3: "[| 2 < p; zprime p; ~([x = 0](mod p)) |] ==> | 
| 18369 | 214 | ~([MultInv p x = 0](mod p))" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 215 | apply (auto simp add: MultInv_def zcong_eq_zdvd_prop aux_1) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 216 | apply (drule aux_2) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 217 | apply (drule zpower_zdvd_prop2, auto) | 
| 18369 | 218 | done | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 219 | |
| 19670 | 220 | lemma aux__1: "[| 2 < p; zprime p; ~([x = 0](mod p))|] ==> | 
| 221 | [(MultInv p (MultInv p x)) = (x * (MultInv p x) * | |
| 18369 | 222 | (MultInv p (MultInv p x)))] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 223 | apply (drule MultInv_prop2, auto) | 
| 18369 | 224 | apply (drule_tac k = "MultInv p (MultInv p x)" in zcong_scalar, auto) | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 225 | apply (auto simp add: zcong_sym) | 
| 18369 | 226 | done | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 227 | |
| 16663 | 228 | lemma aux__2: "[| 2 < p; zprime p; ~([x = 0](mod p))|] ==> | 
| 18369 | 229 | [(x * (MultInv p x) * (MultInv p (MultInv p x))) = x] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 230 | apply (frule MultInv_prop3, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 231 | apply (insert MultInv_prop2 [of p "MultInv p x"], auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 232 | apply (drule MultInv_prop2, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 233 | apply (drule_tac k = x in zcong_scalar2, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 234 | apply (auto simp add: zmult_ac) | 
| 18369 | 235 | done | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 236 | |
| 19670 | 237 | lemma MultInv_prop4: "[| 2 < p; zprime p; ~([x = 0](mod p)) |] ==> | 
| 18369 | 238 | [(MultInv p (MultInv p x)) = x] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 239 | apply (frule aux__1, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 240 | apply (drule aux__2, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 241 | apply (drule zcong_trans, auto) | 
| 18369 | 242 | done | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 243 | |
| 19670 | 244 | lemma MultInv_prop5: "[| 2 < p; zprime p; ~([x = 0](mod p)); | 
| 245 | ~([y = 0](mod p)); [(MultInv p x) = (MultInv p y)] (mod p) |] ==> | |
| 18369 | 246 | [x = y] (mod p)" | 
| 19670 | 247 | apply (drule_tac a = "MultInv p x" and b = "MultInv p y" and | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 248 | m = p and k = x in zcong_scalar) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 249 | apply (insert MultInv_prop2 [of p x], simp) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 250 | apply (auto simp only: zcong_sym [of "MultInv p x * x"]) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 251 | apply (auto simp add: zmult_ac) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 252 | apply (drule zcong_trans, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 253 | apply (drule_tac a = "x * MultInv p y" and k = y in zcong_scalar, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 254 | apply (insert MultInv_prop2a [of p y], auto simp add: zmult_ac) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 255 | apply (insert zcong_zmult_prop2 [of "y * MultInv p y" 1 p y x]) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 256 | apply (auto simp add: zcong_sym) | 
| 18369 | 257 | done | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 258 | |
| 19670 | 259 | lemma MultInv_zcong_prop1: "[| 2 < p; [j = k] (mod p) |] ==> | 
| 18369 | 260 | [a * MultInv p j = a * MultInv p k] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 261 | by (drule MultInv_prop1, auto simp add: zcong_scalar2) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 262 | |
| 19670 | 263 | lemma aux___1: "[j = a * MultInv p k] (mod p) ==> | 
| 18369 | 264 | [j * k = a * MultInv p k * k] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 265 | by (auto simp add: zcong_scalar) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 266 | |
| 19670 | 267 | lemma aux___2: "[|2 < p; zprime p; ~([k = 0](mod p)); | 
| 18369 | 268 | [j * k = a * MultInv p k * k] (mod p) |] ==> [j * k = a] (mod p)" | 
| 19670 | 269 | apply (insert MultInv_prop2a [of p k] zcong_zmult_prop2 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 270 | [of "MultInv p k * k" 1 p "j * k" a]) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 271 | apply (auto simp add: zmult_ac) | 
| 18369 | 272 | done | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 273 | |
| 19670 | 274 | lemma aux___3: "[j * k = a] (mod p) ==> [(MultInv p j) * j * k = | 
| 18369 | 275 | (MultInv p j) * a] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 276 | by (auto simp add: zmult_assoc zcong_scalar2) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 277 | |
| 19670 | 278 | lemma aux___4: "[|2 < p; zprime p; ~([j = 0](mod p)); | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 279 | [(MultInv p j) * j * k = (MultInv p j) * a] (mod p) |] | 
| 18369 | 280 | ==> [k = a * (MultInv p j)] (mod p)" | 
| 19670 | 281 | apply (insert MultInv_prop2a [of p j] zcong_zmult_prop1 | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 282 | [of "MultInv p j * j" 1 p "MultInv p j * a" k]) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 283 | apply (auto simp add: zmult_ac zcong_sym) | 
| 18369 | 284 | done | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 285 | |
| 19670 | 286 | lemma MultInv_zcong_prop2: "[| 2 < p; zprime p; ~([k = 0](mod p)); | 
| 287 | ~([j = 0](mod p)); [j = a * MultInv p k] (mod p) |] ==> | |
| 18369 | 288 | [k = a * MultInv p j] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 289 | apply (drule aux___1) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 290 | apply (frule aux___2, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 291 | by (drule aux___3, drule aux___4, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 292 | |
| 19670 | 293 | lemma MultInv_zcong_prop3: "[| 2 < p; zprime p; ~([a = 0](mod p)); | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 294 | ~([k = 0](mod p)); ~([j = 0](mod p)); | 
| 19670 | 295 | [a * MultInv p j = a * MultInv p k] (mod p) |] ==> | 
| 18369 | 296 | [j = k] (mod p)" | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 297 | apply (auto simp add: zcong_eq_zdvd_prop [of a p]) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 298 | apply (frule zprime_imp_zrelprime, auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 299 | apply (insert zcong_cancel2 [of p a "MultInv p j" "MultInv p k"], auto) | 
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 300 | apply (drule MultInv_prop5, auto) | 
| 18369 | 301 | done | 
| 13871 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 302 | |
| 
26e5f5e624f6
Gauss's law of quadratic reciprocity by Avigad, Gray and Kramer
 paulson parents: diff
changeset | 303 | end |