src/HOL/GCD.thy
changeset 31730 d74830dc3e4a
parent 31729 b9299916d618
child 31734 a4a79836d07b
equal deleted inserted replaced
31729:b9299916d618 31730:d74830dc3e4a
   280   apply (subst int_gcd_abs)
   280   apply (subst int_gcd_abs)
   281   apply (rule dvd_trans)
   281   apply (rule dvd_trans)
   282   apply (rule nat_gcd_dvd2 [transferred])
   282   apply (rule nat_gcd_dvd2 [transferred])
   283   apply auto
   283   apply auto
   284 done
   284 done
       
   285 
       
   286 lemma dvd_gcd_D1_nat: "k dvd gcd m n \<Longrightarrow> (k::nat) dvd m"
       
   287 by(metis nat_gcd_dvd1 dvd_trans)
       
   288 
       
   289 lemma dvd_gcd_D2_nat: "k dvd gcd m n \<Longrightarrow> (k::nat) dvd n"
       
   290 by(metis nat_gcd_dvd2 dvd_trans)
       
   291 
       
   292 lemma dvd_gcd_D1_int: "i dvd gcd m n \<Longrightarrow> (i::int) dvd m"
       
   293 by(metis int_gcd_dvd1 dvd_trans)
       
   294 
       
   295 lemma dvd_gcd_D2_int: "i dvd gcd m n \<Longrightarrow> (i::int) dvd n"
       
   296 by(metis int_gcd_dvd2 dvd_trans)
   285 
   297 
   286 lemma nat_gcd_le1 [simp]: "a \<noteq> 0 \<Longrightarrow> gcd (a::nat) b \<le> a"
   298 lemma nat_gcd_le1 [simp]: "a \<noteq> 0 \<Longrightarrow> gcd (a::nat) b \<le> a"
   287   by (rule dvd_imp_le, auto)
   299   by (rule dvd_imp_le, auto)
   288 
   300 
   289 lemma nat_gcd_le2 [simp]: "b \<noteq> 0 \<Longrightarrow> gcd (a::nat) b \<le> b"
   301 lemma nat_gcd_le2 [simp]: "b \<noteq> 0 \<Longrightarrow> gcd (a::nat) b \<le> b"
  1384   apply (rule dvd_trans)
  1396   apply (rule dvd_trans)
  1385   apply (rule nat_lcm_least [transferred, of _ "abs k" _])
  1397   apply (rule nat_lcm_least [transferred, of _ "abs k" _])
  1386   using prems apply auto
  1398   using prems apply auto
  1387 done
  1399 done
  1388 
  1400 
  1389 lemma nat_lcm_dvd1 [iff]: "(m::nat) dvd lcm m n"
  1401 lemma nat_lcm_dvd1: "(m::nat) dvd lcm m n"
  1390 proof (cases m)
  1402 proof (cases m)
  1391   case 0 then show ?thesis by simp
  1403   case 0 then show ?thesis by simp
  1392 next
  1404 next
  1393   case (Suc _)
  1405   case (Suc _)
  1394   then have mpos: "m > 0" by simp
  1406   then have mpos: "m > 0" by simp
  1405     also have "\<dots> = m * k" using mpos npos nat_gcd_zero by simp
  1417     also have "\<dots> = m * k" using mpos npos nat_gcd_zero by simp
  1406     finally show ?thesis by (simp add: lcm_nat_def)
  1418     finally show ?thesis by (simp add: lcm_nat_def)
  1407   qed
  1419   qed
  1408 qed
  1420 qed
  1409 
  1421 
  1410 lemma int_lcm_dvd1 [iff]: "(m::int) dvd lcm m n"
  1422 lemma int_lcm_dvd1: "(m::int) dvd lcm m n"
  1411   apply (subst int_lcm_abs)
  1423   apply (subst int_lcm_abs)
  1412   apply (rule dvd_trans)
  1424   apply (rule dvd_trans)
  1413   prefer 2
  1425   prefer 2
  1414   apply (rule nat_lcm_dvd1 [transferred])
  1426   apply (rule nat_lcm_dvd1 [transferred])
  1415   apply auto
  1427   apply auto
  1416 done
  1428 done
  1417 
  1429 
  1418 lemma nat_lcm_dvd2 [iff]: "(n::nat) dvd lcm m n"
  1430 lemma nat_lcm_dvd2: "(n::nat) dvd lcm m n"
  1419   by (subst nat_lcm_commute, rule nat_lcm_dvd1)
  1431   by (subst nat_lcm_commute, rule nat_lcm_dvd1)
  1420 
  1432 
  1421 lemma int_lcm_dvd2 [iff]: "(n::int) dvd lcm m n"
  1433 lemma int_lcm_dvd2: "(n::int) dvd lcm m n"
  1422   by (subst int_lcm_commute, rule int_lcm_dvd1)
  1434   by (subst int_lcm_commute, rule int_lcm_dvd1)
  1423 
  1435 
  1424 lemma dvd_lcm_if_dvd1_nat: "(k::nat) dvd m \<Longrightarrow> k dvd lcm m n"
  1436 lemma dvd_lcm_I1_nat[simp]: "(k::nat) dvd m \<Longrightarrow> k dvd lcm m n"
  1425 by(metis nat_lcm_dvd1 dvd_trans)
  1437 by(metis nat_lcm_dvd1 dvd_trans)
  1426 
  1438 
  1427 lemma dvd_lcm_if_dvd2_nat: "(k::nat) dvd n \<Longrightarrow> k dvd lcm m n"
  1439 lemma dvd_lcm_I2_nat[simp]: "(k::nat) dvd n \<Longrightarrow> k dvd lcm m n"
  1428 by(metis nat_lcm_dvd2 dvd_trans)
  1440 by(metis nat_lcm_dvd2 dvd_trans)
  1429 
  1441 
  1430 lemma dvd_lcm_if_dvd1_int: "(i::int) dvd m \<Longrightarrow> i dvd lcm m n"
  1442 lemma dvd_lcm_I1_int[simp]: "(i::int) dvd m \<Longrightarrow> i dvd lcm m n"
  1431 by(metis int_lcm_dvd1 dvd_trans)
  1443 by(metis int_lcm_dvd1 dvd_trans)
  1432 
  1444 
  1433 lemma dvd_lcm_if_dvd2_int: "(i::int) dvd n \<Longrightarrow> i dvd lcm m n"
  1445 lemma dvd_lcm_I2_int[simp]: "(i::int) dvd n \<Longrightarrow> i dvd lcm m n"
  1434 by(metis int_lcm_dvd2 dvd_trans)
  1446 by(metis int_lcm_dvd2 dvd_trans)
  1435 
  1447 
  1436 lemma nat_lcm_unique: "(a::nat) dvd d \<and> b dvd d \<and>
  1448 lemma nat_lcm_unique: "(a::nat) dvd d \<and> b dvd d \<and>
  1437     (\<forall>e. a dvd e \<and> b dvd e \<longrightarrow> d dvd e) \<longleftrightarrow> d = lcm a b"
  1449     (\<forall>e. a dvd e \<and> b dvd e \<longrightarrow> d dvd e) \<longleftrightarrow> d = lcm a b"
  1438   by (auto intro: dvd_anti_sym nat_lcm_least)
  1450   by (auto intro: dvd_anti_sym nat_lcm_least nat_lcm_dvd1 nat_lcm_dvd2)
  1439 
  1451 
  1440 lemma int_lcm_unique: "d >= 0 \<and> (a::int) dvd d \<and> b dvd d \<and>
  1452 lemma int_lcm_unique: "d >= 0 \<and> (a::int) dvd d \<and> b dvd d \<and>
  1441     (\<forall>e. a dvd e \<and> b dvd e \<longrightarrow> d dvd e) \<longleftrightarrow> d = lcm a b"
  1453     (\<forall>e. a dvd e \<and> b dvd e \<longrightarrow> d dvd e) \<longleftrightarrow> d = lcm a b"
  1442   by (auto intro: dvd_anti_sym [transferred] int_lcm_least)
  1454   by (auto intro: dvd_anti_sym [transferred] int_lcm_least)
  1443 
  1455