src/HOL/GCD.thy
changeset 64591 240a39af9ec4
parent 64272 f76b6dda2e56
child 64850 fc9265882329
equal deleted inserted replaced
64590:6621d91d3c8a 64591:240a39af9ec4
   637   moreover from gcd_greatest [OF dvdgg'] have "?g * ?g' dvd ?g" .
   637   moreover from gcd_greatest [OF dvdgg'] have "?g * ?g' dvd ?g" .
   638   ultimately show ?thesis
   638   ultimately show ?thesis
   639     using dvd_times_left_cancel_iff [of "gcd a b" _ 1] by simp
   639     using dvd_times_left_cancel_iff [of "gcd a b" _ 1] by simp
   640 qed
   640 qed
   641 
   641 
   642 
       
   643 lemma divides_mult:
   642 lemma divides_mult:
   644   assumes "a dvd c" and nr: "b dvd c" and "coprime a b"
   643   assumes "a dvd c" and nr: "b dvd c" and "coprime a b"
   645   shows "a * b dvd c"
   644   shows "a * b dvd c"
   646 proof -
   645 proof -
   647   from \<open>b dvd c\<close> obtain b' where"c = b * b'" ..
   646   from \<open>b dvd c\<close> obtain b' where"c = b * b'" ..
   692   done
   691   done
   693 
   692 
   694 lemma coprime_mul_eq: "gcd d (a * b) = 1 \<longleftrightarrow> gcd d a = 1 \<and> gcd d b = 1"
   693 lemma coprime_mul_eq: "gcd d (a * b) = 1 \<longleftrightarrow> gcd d a = 1 \<and> gcd d b = 1"
   695   using coprime_rmult[of d a b] coprime_lmult[of d a b] coprime_mult[of d a b]
   694   using coprime_rmult[of d a b] coprime_lmult[of d a b] coprime_mult[of d a b]
   696   by blast
   695   by blast
       
   696 
       
   697 lemma coprime_mul_eq':
       
   698   "coprime (a * b) d \<longleftrightarrow> coprime a d \<and> coprime b d"
       
   699   using coprime_mul_eq [of d a b] by (simp add: gcd.commute)
   697 
   700 
   698 lemma gcd_coprime:
   701 lemma gcd_coprime:
   699   assumes c: "gcd a b \<noteq> 0"
   702   assumes c: "gcd a b \<noteq> 0"
   700     and a: "a = a' * gcd a b"
   703     and a: "a = a' * gcd a b"
   701     and b: "b = b' * gcd a b"
   704     and b: "b = b' * gcd a b"
   955   hence "p dvd b * gcd a p" by (simp add: gcd_mult_distrib)
   958   hence "p dvd b * gcd a p" by (simp add: gcd_mult_distrib)
   956   with False have "y dvd b" 
   959   with False have "y dvd b" 
   957     by (simp add: x_def y_def div_dvd_iff_mult assms)
   960     by (simp add: x_def y_def div_dvd_iff_mult assms)
   958   ultimately show ?thesis by (rule that)
   961   ultimately show ?thesis by (rule that)
   959 qed
   962 qed
       
   963 
       
   964 lemma coprime_crossproduct':
       
   965   fixes a b c d
       
   966   assumes "b \<noteq> 0"
       
   967   assumes unit_factors: "unit_factor b = unit_factor d"
       
   968   assumes coprime: "coprime a b" "coprime c d"
       
   969   shows "a * d = b * c \<longleftrightarrow> a = c \<and> b = d"
       
   970 proof safe
       
   971   assume eq: "a * d = b * c"
       
   972   hence "normalize a * normalize d = normalize c * normalize b"
       
   973     by (simp only: normalize_mult [symmetric] mult_ac)
       
   974   with coprime have "normalize b = normalize d"
       
   975     by (subst (asm) coprime_crossproduct) simp_all
       
   976   from this and unit_factors show "b = d"
       
   977     by (rule normalize_unit_factor_eqI)
       
   978   from eq have "a * d = c * d" by (simp only: \<open>b = d\<close> mult_ac)
       
   979   with \<open>b \<noteq> 0\<close> \<open>b = d\<close> show "a = c" by simp
       
   980 qed (simp_all add: mult_ac)
   960 
   981 
   961 end
   982 end
   962 
   983 
   963 class ring_gcd = comm_ring_1 + semiring_gcd
   984 class ring_gcd = comm_ring_1 + semiring_gcd
   964 begin
   985 begin