(* Specifications: *)
Lemma prime_div_or_gcd1 : forall (p : nat) (a : Z), Prime p -> ZDivides (Z_of_nat p) a \/ gcd (Z_of_nat p) a 1.
Lemma divmultgcd : forall a b c : Z, a <> 0%Z -> ZDivides a (b * c) -> gcd a b 1 -> ZDivides a c.
Lemma primedivmult : forall p n m : nat, Prime p -> Divides p (n * m) -> Divides p n \/ Divides p m.
Lemma mod_mult_inv_r : forall (a : Z) (p : nat), Prime p -> ~ Mod a 0 p -> exists ra : Z, Mod (a * ra) 1 p.
Lemma mod_mult_cancel_r : forall (a b c : Z) (p : nat), Prime p -> ~ Mod c 0 p -> Mod (a * c) (b * c) p -> Mod a b p.
Lemma mod_mult_0 : forall (p : nat) (a b : Z), Prime p -> Mod (a * b) 0 p -> Mod a 0 p \/ Mod b 0 p.
Lemma mod_not_exp_0 : forall p : nat, Prime p -> forall a : Z, ~ Mod a 0 p -> forall m : nat, ~ Mod (Exp a m) 0 p.
Lemma techlemma3 : forall (qlist : natlist) (a b : nat), 0 < a -> a < b -> Divides a b -> b = product qlist -> allPrime qlist -> exists qi : nat, inlist nat qi qlist /\ Divides a (multDrop qi qlist).
Lemma predminus1 : forall n : nat, pred n = n - 1.
Lemma le_mult_l : forall p q : nat, p <= q -> forall r : nat, r * p <= r * q.
Lemma lt_plus_plus : forall n m p q : nat, n < m -> p < q -> n + p < m + q.
Lemma lt_mult_l : forall p q : nat, p < q -> forall r : nat, S r * p < S r * q.
Lemma le_mult_r : forall p q : nat, p <= q -> forall r : nat, p * r <= q * r.
Lemma sqrbound : forall p q : nat, p * p <= p * q \/ q * q <= p * q.
Lemma le_n_nm : forall n m : nat, n <= n * S m.
Lemma le_n_mn : forall n m : nat, n <= S m * n.
Lemma le_n_nn : forall n : nat, n <= n * n.
Lemma lt_n_nm : forall n m : nat, 0 < n -> 1 < m -> n < n * m.
Lemma sqr_ascend : forall n : nat, n > 1 -> n < n * n.
Lemma witness_le : forall x y : nat, (exists q : nat, x + q = y) -> x <= y.
Lemma le_witness : forall x y : nat, x <= y -> exists q : nat, x + q = y.
Lemma lt_witness : forall x y : nat, x < y -> exists q : nat, x + q = y /\ 0 < q.
Lemma le_le_mult : forall b a c d : nat, a <= b -> c <= d -> a * c <= b * d.
Lemma lt_lt_mult : forall a b c d : nat, a < b -> c < d -> a * c < b * d.
Lemma lt_n_nm_m_gt_1 : forall a b : nat, a < a * b -> b > 1.
Lemma n0n1_or_gt : forall n : nat, n = 0 \/ n = 1 \/ n > 1.
Lemma lt_multpred_pp : forall p : nat, p > 1 -> pred p * pred p < p * p.
Lemma le_diff0 : forall b a c : nat, a <= b -> a = b + c -> c = 0.
Lemma simpl_lt_mult_l : forall a b c : nat, a * b < a * c -> b < c.
Lemma simpl_le_mult_l : forall a b c : nat, 0 < a -> a * b <= a * c -> b <= c.
Lemma simpl_eq_mult_l : forall a b c : nat, 0 < a -> a * b = a * c -> b = c.
Lemma mult_ppq_p0q1 : forall p q : nat, p = p * q -> p = 0 \/ q = 1.
Lemma mult_pq1_p1q1 : forall p q : nat, p * q = 1 -> p = 1 /\ q = 1.
Lemma Zmult_ab0a0b0 : forall a b : Z, (a * b)%Z = 0%Z -> a = 0%Z \/ b = 0%Z.
Lemma Zle_minus : forall a b : Z, (b <= a)%Z -> (0 <= a - b)%Z.
Lemma Zopp_lt_gt_0 : forall x : Z, (x < 0)%Z -> (- x > 0)%Z.
Lemma Zlt_neq : forall x y : Z, (x < y)%Z -> x <> y.
Lemma Zgt_neq : forall x y : Z, (x > y)%Z -> x <> y.
Lemma S_inj : forall n m : nat, S n = S m -> n = m.
Lemma Zlt_mult_l : forall p q r : Z, (0 < r)%Z -> (p < q)%Z -> (r * p < r * q)%Z.
Lemma Zle_mult_l : forall p q r : Z, (0 < r)%Z -> (p <= q)%Z -> (r * p <= r * q)%Z.
Lemma abs_opp : forall x : Z, Zabs_nat x = Zabs_nat (- x).
Lemma inj_abs_pos : forall x : Z, (x >= 0)%Z -> Z_of_nat (Zabs_nat x) = x.
Lemma inj_abs_neg : forall x : Z, (x < 0)%Z -> Z_of_nat (Zabs_nat x) = (- x)%Z.
Lemma abs_inj : forall n : nat, Zabs_nat (Z_of_nat n) = n.
Lemma abs_mult : forall x y : Z, Zabs_nat (x * y) = Zabs_nat x * Zabs_nat y.
Lemma isnat_inj_abs : forall (x : Z) (n : nat), x = Z_of_nat n -> n = Zabs_nat x.
Lemma isnat_abs_inj : forall (x : Z) (n : nat), (0 <= x)%Z -> n = Zabs_nat x -> x = Z_of_nat n.
Lemma isnat_plus : forall x y : Z, (0 <= x)%Z -> (0 <= y)%Z -> (0 <= x + y)%Z.
Lemma isnat_mult : forall x y : Z, (0 <= x)%Z -> (0 <= y)%Z -> (0 <= x * y)%Z.
Lemma lezle : forall x y : Z, (0 <= x)%Z -> (0 <= y)%Z -> (x <= y)%Z -> Zabs_nat x <= Zabs_nat y.
Lemma gtzgt : forall x y : Z, (0 <= x)%Z -> (0 <= y)%Z -> (x > y)%Z -> Zabs_nat x > Zabs_nat y.
Lemma ltzlt : forall x y : Z, (0 <= x)%Z -> (0 <= y)%Z -> (x < y)%Z -> Zabs_nat x < Zabs_nat y.
Lemma abs_plus_pos : forall x y : Z, (0 <= x)%Z -> (0 <= y)%Z -> Zabs_nat (x + y) = Zabs_nat x + Zabs_nat y.
Lemma abs_minus_pos : forall x y : Z, (0 <= x)%Z -> (0 <= y)%Z -> (x >= y)%Z -> Zabs_nat (x - y) = Zabs_nat x - Zabs_nat y.
Lemma abs_pred_pos : forall x : Z, (0 < x)%Z -> pred (Zabs_nat x) = Zabs_nat (x - 1).
Lemma abs_neq_lt : forall x : Z, x <> 0%Z -> 0 < Zabs_nat x.
Lemma nat_ge_0 : forall n : nat, (Z_of_nat n >= 0)%Z.