diff -r 1e29e2666a15 -r e7e54a0b9197 src/HOL/Euclidean_Division.thy --- a/src/HOL/Euclidean_Division.thy Sat Nov 11 18:33:35 2017 +0000 +++ b/src/HOL/Euclidean_Division.thy Sat Nov 11 18:41:08 2017 +0000 @@ -125,6 +125,15 @@ "a mod b = 0" if "is_unit b" using that by (simp add: mod_eq_0_iff_dvd unit_imp_dvd) +lemma coprime_mod_left_iff [simp]: + "coprime (a mod b) b \ coprime a b" if "b \ 0" + by (rule; rule coprimeI) + (use that in \auto dest!: dvd_mod_imp_dvd coprime_common_divisor simp add: dvd_mod_iff\) + +lemma coprime_mod_right_iff [simp]: + "coprime a (b mod a) \ coprime a b" if "a \ 0" + using that coprime_mod_left_iff [of a b] by (simp add: ac_simps) + end class euclidean_ring = idom_modulo + euclidean_semiring @@ -533,6 +542,10 @@ with that show thesis . qed +lemma invertible_coprime: + "coprime a c" if "a * b mod c = 1" + by (rule coprimeI) (use that dvd_mod_iff [of _ c "a * b"] in auto) + end @@ -772,6 +785,18 @@ end +lemma coprime_Suc_0_left [simp]: + "coprime (Suc 0) n" + using coprime_1_left [of n] by simp + +lemma coprime_Suc_0_right [simp]: + "coprime n (Suc 0)" + using coprime_1_right [of n] by simp + +lemma coprime_common_divisor_nat: "coprime a b \ x dvd a \ x dvd b \ x = 1" + for a b :: nat + by (drule coprime_common_divisor [of _ _ x]) simp_all + instantiation nat :: unique_euclidean_semiring begin @@ -1422,6 +1447,64 @@ end +lemma coprime_int_iff [simp]: + "coprime (int m) (int n) \ coprime m n" (is "?P \ ?Q") +proof + assume ?P + show ?Q + proof (rule coprimeI) + fix q + assume "q dvd m" "q dvd n" + then have "int q dvd int m" "int q dvd int n" + by (simp_all add: zdvd_int) + with \?P\ have "is_unit (int q)" + by (rule coprime_common_divisor) + then show "is_unit q" + by simp + qed +next + assume ?Q + show ?P + proof (rule coprimeI) + fix k + assume "k dvd int m" "k dvd int n" + then have "nat \k\ dvd m" "nat \k\ dvd n" + by (simp_all add: zdvd_int) + with \?Q\ have "is_unit (nat \k\)" + by (rule coprime_common_divisor) + then show "is_unit k" + by simp + qed +qed + +lemma coprime_abs_left_iff [simp]: + "coprime \k\ l \ coprime k l" for k l :: int + using coprime_normalize_left_iff [of k l] by simp + +lemma coprime_abs_right_iff [simp]: + "coprime k \l\ \ coprime k l" for k l :: int + using coprime_abs_left_iff [of l k] by (simp add: ac_simps) + +lemma coprime_nat_abs_left_iff [simp]: + "coprime (nat \k\) n \ coprime k (int n)" +proof - + define m where "m = nat \k\" + then have "\k\ = int m" + by simp + moreover have "coprime k (int n) \ coprime \k\ (int n)" + by simp + ultimately show ?thesis + by simp +qed + +lemma coprime_nat_abs_right_iff [simp]: + "coprime n (nat \k\) \ coprime (int n) k" + using coprime_nat_abs_left_iff [of k n] by (simp add: ac_simps) + +lemma coprime_common_divisor_int: "coprime a b \ x dvd a \ x dvd b \ \x\ = 1" + for a b :: int + by (drule coprime_common_divisor [of _ _ x]) simp_all + instantiation int :: idom_modulo begin