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)" |