src/HOL/Number_Theory/Gauss.thy
changeset 63534 523b488b15c9
parent 62429 25271ff79171
child 63566 e5abbdee461a
equal deleted inserted replaced
63525:f01d1e393f3f 63534:523b488b15c9
   107     assume a: "[x * a = y * a] (mod p)"
   107     assume a: "[x * a = y * a] (mod p)"
   108     assume b: "0 < x"
   108     assume b: "0 < x"
   109     assume c: "x \<le> (int p - 1) div 2"
   109     assume c: "x \<le> (int p - 1) div 2"
   110     assume d: "0 < y"
   110     assume d: "0 < y"
   111     assume e: "y \<le> (int p - 1) div 2"
   111     assume e: "y \<le> (int p - 1) div 2"
   112     from a p_a_relprime p_prime a_nonzero cong_mult_rcancel_int [of _ a x y]
   112     from p_a_relprime have "\<not>p dvd a"
   113     have "[x = y](mod p)"
   113       by (simp add: cong_altdef_int)
   114       by (metis monoid_mult_class.mult.left_neutral cong_dvd_modulus_int cong_mult_rcancel_int 
   114     with p_prime have "coprime a (int p)" 
   115                 cong_mult_self_int gcd.commute prime_imp_coprime_int)
   115        by (subst gcd.commute, intro is_prime_imp_coprime) auto
       
   116     with a cong_mult_rcancel_int [of a "int p" x y]
       
   117       have "[x = y] (mod p)" by simp
   116     with cong_less_imp_eq_int [of x y p] p_minus_one_l
   118     with cong_less_imp_eq_int [of x y p] p_minus_one_l
   117         order_le_less_trans [of x "(int p - 1) div 2" p]
   119         order_le_less_trans [of x "(int p - 1) div 2" p]
   118         order_le_less_trans [of y "(int p - 1) div 2" p] 
   120         order_le_less_trans [of y "(int p - 1) div 2" p] 
   119     have "x = y"
   121     have "x = y"
   120       by (metis b c cong_less_imp_eq_int d e zero_less_imp_eq_int of_nat_0_le_iff)
   122       by (metis b c cong_less_imp_eq_int d e zero_less_imp_eq_int of_nat_0_le_iff)
   135   assume b: "0 < x"
   137   assume b: "0 < x"
   136   assume c: "x \<le> (int p - 1) div 2"
   138   assume c: "x \<le> (int p - 1) div 2"
   137   assume d: "0 < y"
   139   assume d: "0 < y"
   138   assume e: "y \<le> (int p - 1) div 2"
   140   assume e: "y \<le> (int p - 1) div 2"
   139   assume f: "x \<noteq> y"
   141   assume f: "x \<noteq> y"
   140   from a have "[x * a = y * a](mod p)" 
   142   from a have a': "[x * a = y * a](mod p)" 
   141     by (metis cong_int_def)
   143     by (metis cong_int_def)
   142   with p_a_relprime p_prime cong_mult_rcancel_int [of a p x y]
   144   from p_a_relprime have "\<not>p dvd a"
   143   have "[x = y](mod p)" 
   145     by (simp add: cong_altdef_int)
   144     by (metis cong_mult_self_int dvd_div_mult_self gcd.commute prime_imp_coprime_int)
   146   with p_prime have "coprime a (int p)" 
       
   147      by (subst gcd.commute, intro is_prime_imp_coprime) auto
       
   148   with a' cong_mult_rcancel_int [of a "int p" x y]
       
   149     have "[x = y] (mod p)" by simp
   145   with cong_less_imp_eq_int [of x y p] p_minus_one_l
   150   with cong_less_imp_eq_int [of x y p] p_minus_one_l
   146     order_le_less_trans [of x "(int p - 1) div 2" p]
   151     order_le_less_trans [of x "(int p - 1) div 2" p]
   147     order_le_less_trans [of y "(int p - 1) div 2" p] 
   152     order_le_less_trans [of y "(int p - 1) div 2" p] 
   148   have "x = y"
   153   have "x = y"
   149     by (metis b c cong_less_imp_eq_int d e zero_less_imp_eq_int of_nat_0_le_iff)
   154     by (metis b c cong_less_imp_eq_int d e zero_less_imp_eq_int of_nat_0_le_iff)
   168 
   173 
   169 lemma A_greater_zero: "x \<in> A \<Longrightarrow> 0 < x"
   174 lemma A_greater_zero: "x \<in> A \<Longrightarrow> 0 < x"
   170   by (auto simp add: A_def)
   175   by (auto simp add: A_def)
   171 
   176 
   172 lemma B_ncong_p: "x \<in> B \<Longrightarrow> [x \<noteq> 0](mod p)"
   177 lemma B_ncong_p: "x \<in> B \<Longrightarrow> [x \<noteq> 0](mod p)"
   173   by (auto simp add: B_def) (metis cong_prime_prod_zero_int A_ncong_p p_a_relprime p_prime)
   178   by (auto simp: B_def p_prime p_a_relprime A_ncong_p dest: cong_prime_prod_zero_int) 
   174 
   179 
   175 lemma B_greater_zero: "x \<in> B \<Longrightarrow> 0 < x"
   180 lemma B_greater_zero: "x \<in> B \<Longrightarrow> 0 < x"
   176   using a_nonzero by (auto simp add: B_def A_greater_zero)
   181   using a_nonzero by (auto simp add: B_def A_greater_zero)
   177 
   182 
   178 lemma C_greater_zero: "y \<in> C \<Longrightarrow> 0 < y"
   183 lemma C_greater_zero: "y \<in> C \<Longrightarrow> 0 < y"
   200 lemma D_eq: "D = {x. \<exists>y \<in> A. ( x = (y*a) mod p & (y*a) mod p \<le> (int p - 1) div 2)}"
   205 lemma D_eq: "D = {x. \<exists>y \<in> A. ( x = (y*a) mod p & (y*a) mod p \<le> (int p - 1) div 2)}"
   201   by (auto simp add: D_def C_def B_def A_def)
   206   by (auto simp add: D_def C_def B_def A_def)
   202 
   207 
   203 lemma all_A_relprime: assumes "x \<in> A" shows "gcd x p = 1"
   208 lemma all_A_relprime: assumes "x \<in> A" shows "gcd x p = 1"
   204   using p_prime A_ncong_p [OF assms]
   209   using p_prime A_ncong_p [OF assms]
   205   by (simp add: cong_altdef_int) (metis gcd.commute prime_imp_coprime_int)
   210   by (auto simp: cong_altdef_int gcd.commute[of _ "int p"] intro!: is_prime_imp_coprime)
   206 
   211 
   207 lemma A_prod_relprime: "gcd (setprod id A) p = 1"
   212 lemma A_prod_relprime: "gcd (setprod id A) p = 1"
   208   by (metis id_def all_A_relprime setprod_coprime)
   213   by (metis id_def all_A_relprime setprod_coprime)
   209 
   214 
   210 
   215 
   264     by (metis cong_int_def mod_mod_trivial)
   269     by (metis cong_int_def mod_mod_trivial)
   265   ultimately have "[a * (y + z) = 0] (mod p)"
   270   ultimately have "[a * (y + z) = 0] (mod p)"
   266     by (metis cong_int_def mod_add_left_eq mod_add_right_eq mult.commute ring_class.ring_distribs(1))
   271     by (metis cong_int_def mod_add_left_eq mod_add_right_eq mult.commute ring_class.ring_distribs(1))
   267   with p_prime a_nonzero p_a_relprime
   272   with p_prime a_nonzero p_a_relprime
   268   have a: "[y + z = 0] (mod p)"
   273   have a: "[y + z = 0] (mod p)"
   269     by (metis cong_prime_prod_zero_int)
   274     by (auto dest!: cong_prime_prod_zero_int)
   270   assume b: "y \<in> A" and c: "z \<in> A"
   275   assume b: "y \<in> A" and c: "z \<in> A"
   271   with A_def have "0 < y + z"
   276   with A_def have "0 < y + z"
   272     by auto
   277     by auto
   273   moreover from b c p_eq2 A_def have "y + z < p"
   278   moreover from b c p_eq2 A_def have "y + z < p"
   274     by auto
   279     by auto