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 |