src/HOL/Number_Theory/Cong.thy
changeset 82518 da14e77a48b2
parent 82080 0aa2d1c132b2
equal deleted inserted replaced
82517:111b1b2a2d13 82518:da14e77a48b2
   125   by (simp add: cong_def mod_mod_cancel mod_add_left_eq)
   125   by (simp add: cong_def mod_mod_cancel mod_add_left_eq)
   126 
   126 
   127 lemma mod_mult_cong_left:
   127 lemma mod_mult_cong_left:
   128   "[c mod (b * a) = d] (mod a) \<longleftrightarrow> [c = d] (mod a)"
   128   "[c mod (b * a) = d] (mod a) \<longleftrightarrow> [c = d] (mod a)"
   129   using mod_mult_cong_right [of c a b d] by (simp add: ac_simps)
   129   using mod_mult_cong_right [of c a b d] by (simp add: ac_simps)
       
   130 
       
   131 lemma cong_mod_leftI [simp]:
       
   132   "[b = c] (mod a) \<Longrightarrow> [b mod a = c] (mod a)"
       
   133   by (simp add: cong_def)  
       
   134 
       
   135 lemma cong_mod_rightI [simp]:
       
   136   "[b = c] (mod a) \<Longrightarrow> [b = c mod a] (mod a)"
       
   137   by (simp add: cong_def)  
       
   138 
       
   139 lemma cong_cmult_leftI: "[a = b] (mod m) \<Longrightarrow> [c * a = c * b] (mod (c * m))"
       
   140   by (metis cong_def local.mult_mod_right)
       
   141 
       
   142 lemma cong_cmult_rightI: "[a = b] (mod m) \<Longrightarrow> [a * c = b * c] (mod (m * c))"
       
   143   using cong_cmult_leftI[of a b m c] by (simp add: mult.commute)
       
   144 
       
   145 lemma cong_dvd_mono_modulus:
       
   146   assumes "[a = b] (mod m)" "m' dvd m"
       
   147   shows   "[a = b] (mod m')"
       
   148   using assms by (metis cong_def local.mod_mod_cancel)
       
   149 
       
   150 lemma coprime_cong_transfer_left:
       
   151   assumes "coprime a b" "[a = a'] (mod b)"
       
   152   shows   "coprime a' b"
       
   153   using assms by (metis cong_0 cong_def local.coprime_mod_left_iff)
       
   154 
       
   155 lemma coprime_cong_transfer_right:
       
   156   assumes "coprime a b" "[b = b'] (mod a)"
       
   157   shows   "coprime a b'"
       
   158   using coprime_cong_transfer_left[of b a b'] assms
       
   159   by (simp add: coprime_commute)
       
   160 
       
   161 lemma coprime_cong_cong_left:
       
   162   assumes "[a = a'] (mod b)"
       
   163   shows   "coprime a b \<longleftrightarrow> coprime a' b"
       
   164   using assms cong_sym_eq coprime_cong_transfer_left by blast
       
   165 
       
   166 lemma coprime_cong_cong_right:
       
   167   assumes "[b = b'] (mod a)"
       
   168   shows   "coprime a b \<longleftrightarrow> coprime a b'"
       
   169   using coprime_cong_cong_left[OF assms] by (simp add: coprime_commute)
   130 
   170 
   131 end
   171 end
   132 
   172 
   133 context unique_euclidean_ring
   173 context unique_euclidean_ring
   134 begin
   174 begin
   197   using that by (auto intro: dvd_trans simp add: cong_iff_dvd_diff)
   237   using that by (auto intro: dvd_trans simp add: cong_iff_dvd_diff)
   198 
   238 
   199 lemma cong_modulus_mult:
   239 lemma cong_modulus_mult:
   200   "[x = y] (mod m)" if "[x = y] (mod m * n)"
   240   "[x = y] (mod m)" if "[x = y] (mod m * n)"
   201   using that by (simp add: cong_iff_dvd_diff) (rule dvd_mult_left)
   241   using that by (simp add: cong_iff_dvd_diff) (rule dvd_mult_left)
       
   242 
       
   243 lemma cong_uminus: "[x = y] (mod m) \<Longrightarrow> [-x = -y] (mod m)"
       
   244   unfolding cong_minus_minus_iff .
   202 
   245 
   203 end
   246 end
   204 
   247 
   205 lemma cong_abs [simp]:
   248 lemma cong_abs [simp]:
   206   "[x = y] (mod \<bar>m\<bar>) \<longleftrightarrow> [x = y] (mod m)"
   249   "[x = y] (mod \<bar>m\<bar>) \<longleftrightarrow> [x = y] (mod m)"