src/HOL/Number_Theory/Gauss.thy
changeset 60526 fad653acf58f
parent 59559 35da1bbf234e
child 60688 01488b559910
equal deleted inserted replaced
60525:278b65d9339c 60526:fad653acf58f
     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: