equal
deleted
inserted
replaced
1 (* Authors: Jeremy Avigad, David Gray, and Adam Kramer |
1 (* Authors: Jeremy Avigad, David Gray, and Adam Kramer |
2 |
2 |
3 Ported by lcp but unfinished |
3 Ported by lcp but unfinished |
4 *) |
4 *) |
5 |
5 |
6 section {* Gauss' Lemma *} |
6 section \<open>Gauss' Lemma\<close> |
7 |
7 |
8 theory Gauss |
8 theory Gauss |
9 imports Residues |
9 imports Residues |
10 begin |
10 begin |
11 |
11 |
36 definition "D = C \<inter> {.. (int p - 1) div 2}" |
36 definition "D = C \<inter> {.. (int p - 1) div 2}" |
37 definition "E = C \<inter> {(int p - 1) div 2 <..}" |
37 definition "E = C \<inter> {(int p - 1) div 2 <..}" |
38 definition "F = (\<lambda>x. (int p - x)) ` E" |
38 definition "F = (\<lambda>x. (int p - x)) ` E" |
39 |
39 |
40 |
40 |
41 subsection {* Basic properties of p *} |
41 subsection \<open>Basic properties of p\<close> |
42 |
42 |
43 lemma odd_p: "odd p" |
43 lemma odd_p: "odd p" |
44 by (metis p_prime p_ge_2 prime_odd_nat) |
44 by (metis p_prime p_ge_2 prime_odd_nat) |
45 |
45 |
46 lemma p_minus_one_l: "(int p - 1) div 2 < p" |
46 lemma p_minus_one_l: "(int p - 1) div 2 < p" |
58 lemma p_odd_int: obtains z::int where "int p = 2*z+1" "0<z" |
58 lemma p_odd_int: obtains z::int where "int p = 2*z+1" "0<z" |
59 using odd_p p_ge_2 |
59 using odd_p p_ge_2 |
60 by (auto simp add: even_iff_mod_2_eq_zero) (metis p_eq2) |
60 by (auto simp add: even_iff_mod_2_eq_zero) (metis p_eq2) |
61 |
61 |
62 |
62 |
63 subsection {* Basic Properties of the Gauss Sets *} |
63 subsection \<open>Basic Properties of the Gauss Sets\<close> |
64 |
64 |
65 lemma finite_A: "finite (A)" |
65 lemma finite_A: "finite (A)" |
66 by (auto simp add: A_def) |
66 by (auto simp add: A_def) |
67 |
67 |
68 lemma finite_B: "finite (B)" |
68 lemma finite_B: "finite (B)" |
206 |
206 |
207 lemma A_prod_relprime: "gcd (setprod id A) p = 1" |
207 lemma A_prod_relprime: "gcd (setprod id A) p = 1" |
208 by (metis id_def all_A_relprime setprod_coprime_int) |
208 by (metis id_def all_A_relprime setprod_coprime_int) |
209 |
209 |
210 |
210 |
211 subsection {* Relationships Between Gauss Sets *} |
211 subsection \<open>Relationships Between Gauss Sets\<close> |
212 |
212 |
213 lemma StandardRes_inj_on_ResSet: "ResSet m X \<Longrightarrow> (inj_on (\<lambda>b. b mod m) X)" |
213 lemma StandardRes_inj_on_ResSet: "ResSet m X \<Longrightarrow> (inj_on (\<lambda>b. b mod m) X)" |
214 by (auto simp add: ResSet_def inj_on_def cong_int_def) |
214 by (auto simp add: ResSet_def inj_on_def cong_int_def) |
215 |
215 |
216 lemma B_card_eq_A: "card B = card A" |
216 lemma B_card_eq_A: "card B = card A" |
313 with two show ?thesis |
313 with two show ?thesis |
314 by simp |
314 by simp |
315 qed |
315 qed |
316 |
316 |
317 |
317 |
318 subsection {* Gauss' Lemma *} |
318 subsection \<open>Gauss' Lemma\<close> |
319 |
319 |
320 lemma aux: "setprod id A * (- 1) ^ card E * a ^ card A * (- 1) ^ card E = setprod id A * a ^ card A" |
320 lemma aux: "setprod id A * (- 1) ^ card E * a ^ card A * (- 1) ^ card E = setprod id A * a ^ card A" |
321 by (metis (no_types) minus_minus mult.commute mult.left_commute power_minus power_one) |
321 by (metis (no_types) minus_minus mult.commute mult.left_commute power_minus power_one) |
322 |
322 |
323 theorem pre_gauss_lemma: |
323 theorem pre_gauss_lemma: |