(** ZMod, same as Mod but only uses Z. *)

Definition ZMod (a b n : Z) := exists q : Z, a = (b + n * q)%Z.

(* Specifications: *)
Lemma zmodpq_modp : forall a b p q : Z, ZMod a b (p * q) -> ZMod a b p.
Lemma zmod_refl : forall a n : Z, ZMod a a n.
Lemma zmod_sym : forall a b n : Z, ZMod a b n -> ZMod b a n.
Lemma zmod_trans : forall a b c n : Z, ZMod a b n -> ZMod b c n -> ZMod a c n.
Lemma zeqmod : forall x y : Z, x = y -> forall n : Z, ZMod x y n.
Lemma zmod_plus_compat : forall a b c d n : Z, ZMod a b n -> ZMod c d n -> ZMod (a + c) (b + d) n.
Lemma zmod_mult_compat : forall a b c d n : Z, ZMod a b n -> ZMod c d n -> ZMod (a * c) (b * d) n.
Lemma zmod_sqr_compat : forall a b n : Z, ZMod a b n -> ZMod (a * a) (b * b) n.
Lemma zmodmod : forall a b n : Z, ZMod a b n -> Mod a b (Zabs_nat n).
Lemma modzmod : forall (a b : Z) (n : nat), Mod a b n -> ZMod a b (Z_of_nat n).
Lemma absmodzmod : forall a b n : Z, Mod a b (Zabs_nat n) -> ZMod a b n.
Lemma zmod_exp_compat : forall a b n : Z, ZMod a b n -> forall m : Z, ZMod (ZExp a m) (ZExp b m) n.
Lemma zmoda0_exp_compat : forall a n : Z, (n > 0)%Z -> ZMod a 0 n -> forall m : Z, (m > 0)%Z -> ZMod (ZExp a m) 0 n.
Lemma zmod_opp_compat : forall a b n : Z, ZMod a b n -> ZMod (- a) (- b) n.
Lemma zmod_minus_compat : forall a b c d n : Z, ZMod a b n -> ZMod c d n -> ZMod (a - c) (b - d) n.
Lemma zmod_nx_0_n : forall n x : Z, ZMod (n * x) 0 n.
Lemma zmoddivmin : forall a b n : Z, ZMod a b n <-> ZDivides n (a - b).
Lemma zmoddec : forall a b n : Z, ZMod a b n \/ ~ ZMod a b n.
Lemma zmod_0not1 : forall n : Z, (n > 1)%Z -> ~ ZMod 0 1 n.
Lemma zmod_repr_non_0 : forall n x : Z, (0 < x < n)%Z -> ~ ZMod x 0 n.