src/HOL/Number_Theory/Cong.thy
changeset 76224 64e8d4afcf10
parent 71546 4dd5dadfc87d
child 76231 8a48e18f081e
equal deleted inserted replaced
76223:be91db94e526 76224:64e8d4afcf10
   276     by (simp add: cong_def nat_mod_eq_iff)
   276     by (simp add: cong_def nat_mod_eq_iff)
   277 qed
   277 qed
   278 
   278 
   279 lemma cong_diff_iff_cong_0_nat:
   279 lemma cong_diff_iff_cong_0_nat:
   280   "[a - b = 0] (mod m) \<longleftrightarrow> [a = b] (mod m)" if "a \<ge> b" for a b :: nat
   280   "[a - b = 0] (mod m) \<longleftrightarrow> [a = b] (mod m)" if "a \<ge> b" for a b :: nat
   281   using that by (auto simp add: cong_def le_imp_diff_is_add dest: nat_mod_eq_lemma)
   281   using that by (simp add: cong_0_iff) (simp add: cong_def mod_eq_dvd_iff_nat)
   282 
   282 
   283 lemma cong_diff_iff_cong_0_nat':
   283 lemma cong_diff_iff_cong_0_nat':
   284   "[nat \<bar>int a - int b\<bar> = 0] (mod m) \<longleftrightarrow> [a = b] (mod m)"
   284   "[nat \<bar>int a - int b\<bar> = 0] (mod m) \<longleftrightarrow> [a = b] (mod m)"
   285 proof (cases "b \<le> a")
   285 proof (cases "b \<le> a")
   286   case True
   286   case True
   346 
   346 
   347 lemma cong_less_unique_int: "0 < m \<Longrightarrow> (\<exists>!b. 0 \<le> b \<and> b < m \<and> [a = b] (mod m))"
   347 lemma cong_less_unique_int: "0 < m \<Longrightarrow> (\<exists>!b. 0 \<le> b \<and> b < m \<and> [a = b] (mod m))"
   348   for a m :: int
   348   for a m :: int
   349   by (auto simp: cong_def)  (metis mod_mod_trivial pos_mod_conj)
   349   by (auto simp: cong_def)  (metis mod_mod_trivial pos_mod_conj)
   350 
   350 
   351 lemma cong_iff_lin_nat: "([a = b] (mod m)) \<longleftrightarrow> (\<exists>k1 k2. b + k1 * m = a + k2 * m)"
   351 lemma cong_iff_lin_nat: "[a = b] (mod m) \<longleftrightarrow> (\<exists>k1 k2. b + k1 * m = a + k2 * m)"
   352   (is "?lhs = ?rhs")
       
   353   for a b :: nat
   352   for a b :: nat
   354 proof
   353   apply (auto simp add: cong_def nat_mod_eq_iff)
   355   assume ?lhs
   354    apply (metis mult.commute)
   356   show ?rhs
   355   apply (metis mult.commute)
   357   proof (cases "b \<le> a")
   356   done
   358     case True
       
   359     with \<open>?lhs\<close> show ?rhs
       
   360       by (metis cong_altdef_nat dvd_def le_add_diff_inverse add_0_right mult_0 mult.commute)
       
   361   next
       
   362     case False
       
   363     with \<open>?lhs\<close> show ?rhs
       
   364       by (metis cong_def mult.commute nat_le_linear nat_mod_eq_lemma)
       
   365   qed
       
   366 next
       
   367   assume ?rhs
       
   368   then show ?lhs
       
   369     by (metis cong_def mult.commute nat_mod_eq_iff) 
       
   370 qed
       
   371 
   357 
   372 lemma cong_cong_mod_nat: "[a = b] (mod m) \<longleftrightarrow> [a mod m = b mod m] (mod m)"
   358 lemma cong_cong_mod_nat: "[a = b] (mod m) \<longleftrightarrow> [a mod m = b mod m] (mod m)"
   373   for a b :: nat
   359   for a b :: nat
   374   by simp
   360   by simp
   375 
   361 
   393   for a x :: nat
   379   for a x :: nat
   394   using cong_add_rcancel_nat [of x a 0 n] by simp
   380   using cong_add_rcancel_nat [of x a 0 n] by simp
   395 
   381 
   396 lemma cong_dvd_modulus_nat: "[x = y] (mod m) \<Longrightarrow> n dvd m \<Longrightarrow> [x = y] (mod n)"
   382 lemma cong_dvd_modulus_nat: "[x = y] (mod m) \<Longrightarrow> n dvd m \<Longrightarrow> [x = y] (mod n)"
   397   for x y :: nat
   383   for x y :: nat
   398   unfolding cong_iff_lin_nat dvd_def
   384   by (auto simp add: cong_altdef_nat')
   399   by (metis mult.commute mult.left_commute)
       
   400 
   385 
   401 lemma cong_to_1_nat:
   386 lemma cong_to_1_nat:
   402   fixes a :: nat
   387   fixes a :: nat
   403   assumes "[a = 1] (mod n)"
   388   assumes "[a = 1] (mod n)"
   404   shows "n dvd (a - 1)"
   389   shows "n dvd (a - 1)"
   426   by (metis add.right_neutral cong_0_1_nat cong_iff_lin_nat cong_to_1_nat
   411   by (metis add.right_neutral cong_0_1_nat cong_iff_lin_nat cong_to_1_nat
   427       dvd_div_mult_self leI le_add_diff_inverse less_one mult_eq_if)
   412       dvd_div_mult_self leI le_add_diff_inverse less_one mult_eq_if)
   428 
   413 
   429 lemma cong_le_nat: "y \<le> x \<Longrightarrow> [x = y] (mod n) \<longleftrightarrow> (\<exists>q. x = q * n + y)"
   414 lemma cong_le_nat: "y \<le> x \<Longrightarrow> [x = y] (mod n) \<longleftrightarrow> (\<exists>q. x = q * n + y)"
   430   for x y :: nat
   415   for x y :: nat
   431   by (auto simp add: cong_altdef_nat le_imp_diff_is_add elim!: dvdE)
   416   by (auto simp add: cong_altdef_nat le_imp_diff_is_add)
   432 
       
   433 
   417 
   434 lemma cong_solve_nat:
   418 lemma cong_solve_nat:
   435   fixes a :: nat
   419   fixes a :: nat
   436   shows "\<exists>x. [a * x = gcd a n] (mod n)"
   420   shows "\<exists>x. [a * x = gcd a n] (mod n)"
   437 proof (cases "a = 0 \<or> n = 0")
   421 proof (cases "a = 0 \<or> n = 0")