src/HOL/GCD.thy
changeset 33657 a4179bf442d1
parent 33318 ddd97d9dfbfb
child 33946 fcc20072df9a
equal deleted inserted replaced
33648:555e5358b8c9 33657:a4179bf442d1
   310 
   310 
   311 lemma gcd_pos_int [simp]: "(gcd (m::int) n > 0) = (m ~= 0 | n ~= 0)"
   311 lemma gcd_pos_int [simp]: "(gcd (m::int) n > 0) = (m ~= 0 | n ~= 0)"
   312   by (insert gcd_zero_int [of m n], insert gcd_ge_0_int [of m n], arith)
   312   by (insert gcd_zero_int [of m n], insert gcd_ge_0_int [of m n], arith)
   313 
   313 
   314 lemma gcd_commute_nat: "gcd (m::nat) n = gcd n m"
   314 lemma gcd_commute_nat: "gcd (m::nat) n = gcd n m"
   315   by (rule dvd_anti_sym, auto)
   315   by (rule dvd_antisym, auto)
   316 
   316 
   317 lemma gcd_commute_int: "gcd (m::int) n = gcd n m"
   317 lemma gcd_commute_int: "gcd (m::int) n = gcd n m"
   318   by (auto simp add: gcd_int_def gcd_commute_nat)
   318   by (auto simp add: gcd_int_def gcd_commute_nat)
   319 
   319 
   320 lemma gcd_assoc_nat: "gcd (gcd (k::nat) m) n = gcd k (gcd m n)"
   320 lemma gcd_assoc_nat: "gcd (gcd (k::nat) m) n = gcd k (gcd m n)"
   321   apply (rule dvd_anti_sym)
   321   apply (rule dvd_antisym)
   322   apply (blast intro: dvd_trans)+
   322   apply (blast intro: dvd_trans)+
   323 done
   323 done
   324 
   324 
   325 lemma gcd_assoc_int: "gcd (gcd (k::int) m) n = gcd k (gcd m n)"
   325 lemma gcd_assoc_int: "gcd (gcd (k::int) m) n = gcd k (gcd m n)"
   326   by (auto simp add: gcd_int_def gcd_assoc_nat)
   326   by (auto simp add: gcd_int_def gcd_assoc_nat)
   337 lemmas gcd_ac_int = gcd_assoc_int gcd_commute_int gcd_left_commute_int
   337 lemmas gcd_ac_int = gcd_assoc_int gcd_commute_int gcd_left_commute_int
   338 
   338 
   339 lemma gcd_unique_nat: "(d::nat) dvd a \<and> d dvd b \<and>
   339 lemma gcd_unique_nat: "(d::nat) dvd a \<and> d dvd b \<and>
   340     (\<forall>e. e dvd a \<and> e dvd b \<longrightarrow> e dvd d) \<longleftrightarrow> d = gcd a b"
   340     (\<forall>e. e dvd a \<and> e dvd b \<longrightarrow> e dvd d) \<longleftrightarrow> d = gcd a b"
   341   apply auto
   341   apply auto
   342   apply (rule dvd_anti_sym)
   342   apply (rule dvd_antisym)
   343   apply (erule (1) gcd_greatest_nat)
   343   apply (erule (1) gcd_greatest_nat)
   344   apply auto
   344   apply auto
   345 done
   345 done
   346 
   346 
   347 lemma gcd_unique_int: "d >= 0 & (d::int) dvd a \<and> d dvd b \<and>
   347 lemma gcd_unique_int: "d >= 0 & (d::int) dvd a \<and> d dvd b \<and>
   348     (\<forall>e. e dvd a \<and> e dvd b \<longrightarrow> e dvd d) \<longleftrightarrow> d = gcd a b"
   348     (\<forall>e. e dvd a \<and> e dvd b \<longrightarrow> e dvd d) \<longleftrightarrow> d = gcd a b"
   349   apply (case_tac "d = 0")
   349 apply (case_tac "d = 0")
   350   apply force
   350  apply simp
   351   apply (rule iffI)
   351 apply (rule iffI)
   352   apply (rule zdvd_anti_sym)
   352  apply (rule zdvd_antisym_nonneg)
   353   apply arith
   353  apply (auto intro: gcd_greatest_int)
   354   apply (subst gcd_pos_int)
       
   355   apply clarsimp
       
   356   apply (drule_tac x = "d + 1" in spec)
       
   357   apply (frule zdvd_imp_le)
       
   358   apply (auto intro: gcd_greatest_int)
       
   359 done
   354 done
   360 
   355 
   361 lemma gcd_proj1_if_dvd_nat [simp]: "(x::nat) dvd y \<Longrightarrow> gcd x y = x"
   356 lemma gcd_proj1_if_dvd_nat [simp]: "(x::nat) dvd y \<Longrightarrow> gcd x y = x"
   362 by (metis dvd.eq_iff gcd_unique_nat)
   357 by (metis dvd.eq_iff gcd_unique_nat)
   363 
   358 
   415 lemma coprime_dvd_mult_iff_int: "coprime (k::int) n \<Longrightarrow>
   410 lemma coprime_dvd_mult_iff_int: "coprime (k::int) n \<Longrightarrow>
   416     (k dvd m * n) = (k dvd m)"
   411     (k dvd m * n) = (k dvd m)"
   417   by (auto intro: coprime_dvd_mult_int)
   412   by (auto intro: coprime_dvd_mult_int)
   418 
   413 
   419 lemma gcd_mult_cancel_nat: "coprime k n \<Longrightarrow> gcd ((k::nat) * m) n = gcd m n"
   414 lemma gcd_mult_cancel_nat: "coprime k n \<Longrightarrow> gcd ((k::nat) * m) n = gcd m n"
   420   apply (rule dvd_anti_sym)
   415   apply (rule dvd_antisym)
   421   apply (rule gcd_greatest_nat)
   416   apply (rule gcd_greatest_nat)
   422   apply (rule_tac n = k in coprime_dvd_mult_nat)
   417   apply (rule_tac n = k in coprime_dvd_mult_nat)
   423   apply (simp add: gcd_assoc_nat)
   418   apply (simp add: gcd_assoc_nat)
   424   apply (simp add: gcd_commute_nat)
   419   apply (simp add: gcd_commute_nat)
   425   apply (simp_all add: mult_commute)
   420   apply (simp_all add: mult_commute)
  1379 lemma dvd_lcm_I2_int[simp]: "(i::int) dvd n \<Longrightarrow> i dvd lcm m n"
  1374 lemma dvd_lcm_I2_int[simp]: "(i::int) dvd n \<Longrightarrow> i dvd lcm m n"
  1380 by(metis lcm_dvd2_int dvd_trans)
  1375 by(metis lcm_dvd2_int dvd_trans)
  1381 
  1376 
  1382 lemma lcm_unique_nat: "(a::nat) dvd d \<and> b dvd d \<and>
  1377 lemma lcm_unique_nat: "(a::nat) dvd d \<and> b dvd d \<and>
  1383     (\<forall>e. a dvd e \<and> b dvd e \<longrightarrow> d dvd e) \<longleftrightarrow> d = lcm a b"
  1378     (\<forall>e. a dvd e \<and> b dvd e \<longrightarrow> d dvd e) \<longleftrightarrow> d = lcm a b"
  1384   by (auto intro: dvd_anti_sym lcm_least_nat lcm_dvd1_nat lcm_dvd2_nat)
  1379   by (auto intro: dvd_antisym lcm_least_nat lcm_dvd1_nat lcm_dvd2_nat)
  1385 
  1380 
  1386 lemma lcm_unique_int: "d >= 0 \<and> (a::int) dvd d \<and> b dvd d \<and>
  1381 lemma lcm_unique_int: "d >= 0 \<and> (a::int) dvd d \<and> b dvd d \<and>
  1387     (\<forall>e. a dvd e \<and> b dvd e \<longrightarrow> d dvd e) \<longleftrightarrow> d = lcm a b"
  1382     (\<forall>e. a dvd e \<and> b dvd e \<longrightarrow> d dvd e) \<longleftrightarrow> d = lcm a b"
  1388   by (auto intro: dvd_anti_sym [transferred] lcm_least_int)
  1383   by (auto intro: dvd_antisym [transferred] lcm_least_int)
  1389 
  1384 
  1390 lemma lcm_proj2_if_dvd_nat [simp]: "(x::nat) dvd y \<Longrightarrow> lcm x y = y"
  1385 lemma lcm_proj2_if_dvd_nat [simp]: "(x::nat) dvd y \<Longrightarrow> lcm x y = y"
  1391   apply (rule sym)
  1386   apply (rule sym)
  1392   apply (subst lcm_unique_nat [symmetric])
  1387   apply (subst lcm_unique_nat [symmetric])
  1393   apply auto
  1388   apply auto