equal
deleted
inserted
replaced
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") |