(** ** Modulo arithmetic *)
(** We define and state properties of equality and arithmetic modulo a positive integer. *)
Section EQ_MODULO.
Variable modul: Z.
Hypothesis modul_pos: modul > 0.
Definition eqmod (x y: Z) : Prop := exists k, x = k * modul + y.

(* Specifications: *)
Lemma eqmod_refl: forall x, eqmod x x.
Lemma eqmod_refl2: forall x y, x = y -> eqmod x y.
Lemma eqmod_sym: forall x y, eqmod x y -> eqmod y x.
Lemma eqmod_trans: forall x y z, eqmod x y -> eqmod y z -> eqmod x z.
Lemma eqmod_small_eq:
forall x y, eqmod x y -> 0 <= x < modul -> 0 <= y < modul -> x = y.
Lemma eqmod_mod_eq:
forall x y, eqmod x y -> x mod modul = y mod modul.
Lemma eqmod_mod:
forall x, eqmod x (x mod modul).
Lemma eqmod_add:
forall a b c d, eqmod a b -> eqmod c d -> eqmod (a + c) (b + d).
Lemma eqmod_neg:
forall x y, eqmod x y -> eqmod (-x) (-y).
Lemma eqmod_sub:
forall a b c d, eqmod a b -> eqmod c d -> eqmod (a - c) (b - d).
Lemma eqmod_mult:
forall a b c d, eqmod a c -> eqmod b d -> eqmod (a * b) (c * d).
Lemma eqmod_refl: forall x, eqmod x x.
Lemma eqmod_refl2: forall x y, x = y -> eqmod x y.
Lemma eqmod_sym: forall x y, eqmod x y -> eqmod y x.
Lemma eqmod_trans: forall x y z, eqmod x y -> eqmod y z -> eqmod x z.
Lemma eqmod_small_eq:
forall x y, eqmod x y -> 0 <= x < modul -> 0 <= y < modul -> x = y.
Lemma eqmod_mod_eq:
forall x y, eqmod x y -> x mod modul = y mod modul.
Lemma eqmod_mod:
forall x, eqmod x (x mod modul).
Lemma eqmod_add:
forall a b c d, eqmod a b -> eqmod c d -> eqmod (a + c) (b + d).
Lemma eqmod_neg:
forall x y, eqmod x y -> eqmod (-x) (-y).
Lemma eqmod_sub:
forall a b c d, eqmod a b -> eqmod c d -> eqmod (a - c) (b - d).
Lemma eqmod_mult:
forall a b c d, eqmod a c -> eqmod b d -> eqmod (a * b) (c * d).