equal
deleted
inserted
replaced
125 |
125 |
126 lemma zcong_refl [simp]: "[k = k] (mod m)" |
126 lemma zcong_refl [simp]: "[k = k] (mod m)" |
127 by (unfold zcong_def, auto) |
127 by (unfold zcong_def, auto) |
128 |
128 |
129 lemma zcong_sym: "[a = b] (mod m) = [b = a] (mod m)" |
129 lemma zcong_sym: "[a = b] (mod m) = [b = a] (mod m)" |
130 apply (unfold zcong_def dvd_def, auto) |
130 unfolding zcong_def minus_diff_eq [of a, symmetric] zdvd_zminus_iff .. |
131 apply (rule_tac [!] x = "-k" in exI, auto) |
|
132 done |
|
133 |
131 |
134 lemma zcong_zadd: |
132 lemma zcong_zadd: |
135 "[a = b] (mod m) ==> [c = d] (mod m) ==> [a + c = b + d] (mod m)" |
133 "[a = b] (mod m) ==> [c = d] (mod m) ==> [a + c = b + d] (mod m)" |
136 apply (unfold zcong_def) |
134 apply (unfold zcong_def) |
137 apply (rule_tac s = "(a - b) + (c - d)" in subst) |
135 apply (rule_tac s = "(a - b) + (c - d)" in subst) |
145 apply (rule_tac [2] zdvd_zdiff, auto) |
143 apply (rule_tac [2] zdvd_zdiff, auto) |
146 done |
144 done |
147 |
145 |
148 lemma zcong_trans: |
146 lemma zcong_trans: |
149 "[a = b] (mod m) ==> [b = c] (mod m) ==> [a = c] (mod m)" |
147 "[a = b] (mod m) ==> [b = c] (mod m) ==> [a = c] (mod m)" |
150 apply (unfold zcong_def dvd_def, auto) |
148 unfolding zcong_def |
151 apply (rule_tac x = "k + ka" in exI) |
149 apply (auto elim!: dvdE simp add: ring_simps) |
152 apply (simp add: zadd_ac zadd_zmult_distrib2) |
150 unfolding left_distrib [symmetric] |
|
151 apply (rule dvd_mult dvd_refl)+ |
153 done |
152 done |
154 |
153 |
155 lemma zcong_zmult: |
154 lemma zcong_zmult: |
156 "[a = b] (mod m) ==> [c = d] (mod m) ==> [a * c = b * d] (mod m)" |
155 "[a = b] (mod m) ==> [c = d] (mod m) ==> [a * c = b * d] (mod m)" |
157 apply (rule_tac b = "b * c" in zcong_trans) |
156 apply (rule_tac b = "b * c" in zcong_trans) |
205 by (simp add: zmult_commute zcong_cancel) |
204 by (simp add: zmult_commute zcong_cancel) |
206 |
205 |
207 lemma zcong_zgcd_zmult_zmod: |
206 lemma zcong_zgcd_zmult_zmod: |
208 "[a = b] (mod m) ==> [a = b] (mod n) ==> zgcd m n = 1 |
207 "[a = b] (mod m) ==> [a = b] (mod n) ==> zgcd m n = 1 |
209 ==> [a = b] (mod m * n)" |
208 ==> [a = b] (mod m * n)" |
210 apply (unfold zcong_def dvd_def, auto) |
209 apply (auto simp add: zcong_def dvd_def) |
211 apply (subgoal_tac "m dvd n * ka") |
210 apply (subgoal_tac "m dvd n * ka") |
212 apply (subgoal_tac "m dvd ka") |
211 apply (subgoal_tac "m dvd ka") |
213 apply (case_tac [2] "0 \<le> ka") |
212 apply (case_tac [2] "0 \<le> ka") |
214 apply (metis zdvd_mult_div_cancel zdvd_refl zdvd_zminus2_iff zdvd_zmultD2 zgcd_zminus zmult_commute zmult_zminus zrelprime_zdvd_zmult) |
213 apply (metis zdvd_mult_div_cancel zdvd_refl zdvd_zminus2_iff zdvd_zmultD2 zgcd_zminus zmult_commute zmult_zminus zrelprime_zdvd_zmult) |
215 apply (metis IntDiv.zdvd_abs1 abs_of_nonneg zadd_0 zgcd_0_left zgcd_commute zgcd_zadd_zmult zgcd_zdvd_zgcd_zmult zgcd_zmult_distrib2_abs zmult_1_right zmult_commute) |
214 apply (metis IntDiv.zdvd_abs1 abs_of_nonneg zadd_0 zgcd_0_left zgcd_commute zgcd_zadd_zmult zgcd_zdvd_zgcd_zmult zgcd_zmult_distrib2_abs zmult_1_right zmult_commute) |
253 apply (rule_tac x = "a mod m" in exI, auto) |
252 apply (rule_tac x = "a mod m" in exI, auto) |
254 apply (metis zmult_div_cancel) |
253 apply (metis zmult_div_cancel) |
255 done |
254 done |
256 |
255 |
257 lemma zcong_iff_lin: "([a = b] (mod m)) = (\<exists>k. b = a + m * k)" |
256 lemma zcong_iff_lin: "([a = b] (mod m)) = (\<exists>k. b = a + m * k)" |
258 apply (unfold zcong_def dvd_def, auto) |
257 unfolding zcong_def |
259 apply (rule_tac [!] x = "-k" in exI, auto) |
258 apply (auto elim!: dvdE simp add: ring_simps) |
|
259 apply (rule_tac x = "-k" in exI) apply simp |
260 done |
260 done |
261 |
261 |
262 lemma zgcd_zcong_zgcd: |
262 lemma zgcd_zcong_zgcd: |
263 "0 < m ==> |
263 "0 < m ==> |
264 zgcd a m = 1 ==> [a = b] (mod m) ==> zgcd b m = 1" |
264 zgcd a m = 1 ==> [a = b] (mod m) ==> zgcd b m = 1" |
304 |
304 |
305 subsection {* Modulo *} |
305 subsection {* Modulo *} |
306 |
306 |
307 lemma zmod_zdvd_zmod: |
307 lemma zmod_zdvd_zmod: |
308 "0 < (m::int) ==> m dvd b ==> (a mod b mod m) = (a mod m)" |
308 "0 < (m::int) ==> m dvd b ==> (a mod b mod m) = (a mod m)" |
309 apply (unfold dvd_def, auto) |
309 by (rule zmod_zmod_cancel) |
310 apply (subst zcong_zmod_eq [symmetric]) |
|
311 prefer 2 |
|
312 apply (subst zcong_iff_lin) |
|
313 apply (rule_tac x = "k * (a div (m * k))" in exI) |
|
314 apply (simp add:zmult_assoc [symmetric], assumption) |
|
315 done |
|
316 |
310 |
317 |
311 |
318 subsection {* Extended GCD *} |
312 subsection {* Extended GCD *} |
319 |
313 |
320 declare xzgcda.simps [simp del] |
314 declare xzgcda.simps [simp del] |