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 |