(** We now define lcm thanks to gcd:  lcm a b = a * (b / gcd a b) = (a / gcd a b) * b = (a*b) / gcd a b  Nota: [lcm 0 0] should be 0, which isn't guarantee with the third equation above. *)
#[global]
Instance lcm_wd : Proper (eq==>eq==>eq) lcm.

(* Specifications: *)
Lemma lcm_equiv2 : forall a b, gcd a b ~= 0 ->
(a / gcd a b) * b == (a*b)/gcd a b.
Lemma gcd_div_swap : forall a b,
(a / gcd a b) * b == a * (b / gcd a b).
Lemma divide_lcm_l : forall a b, (a | lcm a b).
Lemma divide_lcm_r : forall a b, (b | lcm a b).
Lemma divide_div : forall a b c, a~=0 -> (a|b) -> (b|c) -> (b/a|c/a).
Lemma lcm_least : forall a b c,
(a | c) -> (b | c) -> (lcm a b | c).
Lemma lcm_comm : forall a b, lcm a b == lcm b a.
Lemma lcm_divide_iff : forall n m p,
(lcm n m | p) <-> (n | p) /\ (m | p).
Lemma lcm_unique : forall n m p,
0<=p -> (n|p) -> (m|p) ->
(forall q, (n|q) -> (m|q) -> (p|q)) ->
lcm n m == p.
Lemma lcm_unique_alt : forall n m p, 0<=p ->
(forall q, (p|q) <-> (n|q) /\ (m|q)) ->
lcm n m == p.
Lemma lcm_assoc : forall n m p, lcm n (lcm m p) == lcm (lcm n m) p.
Lemma lcm_0_l : forall n, lcm 0 n == 0.
Lemma lcm_0_r : forall n, lcm n 0 == 0.
Lemma lcm_1_l : forall n, lcm 1 n == n.
Lemma lcm_1_r : forall n, lcm n 1 == n.
Lemma lcm_diag : forall n, lcm n n == n.
Lemma lcm_eq_0 : forall n m, lcm n m == 0 <-> n == 0 \/ m == 0.
Lemma divide_lcm_eq_r : forall n m, (n|m) -> lcm n m == m.
Lemma divide_lcm_iff : forall n m, (n|m) <-> lcm n m == m.
Lemma lcm_mul_mono_l :
forall n m p, lcm (p * n) (p * m) == p * lcm n m.
Lemma lcm_mul_mono_r :
forall n m p, lcm (n * p) (m * p) == lcm n m * p.
Lemma gcd_1_lcm_mul : forall n m, n~=0 -> m~=0 ->
(gcd n m == 1 <-> lcm n m == n*m).