Definition modNatAddInverse (n : nat)(p : posnat) :=
  (p - (modNat n p))%nat.

(* Specifications: *)
Lemma modNatAddInverse_correct_gen : forall x y p, modNat x p = modNat y p -> modNat (x + modNatAddInverse y p) p = O.
Lemma modNatAddInverse_correct : forall n p, modNat (n + modNatAddInverse n p) p = O.
Lemma modNat_correct : forall x (p : posnat), exists k, (x = k * p + modNat x p)%nat.
Lemma modNat_divides : forall x p, modNat x p = O -> exists k, (x = k * p)%nat.
Lemma modNatAddInverse_sum_0 : forall x y p, modNat (x + (modNatAddInverse y p)) p = O -> modNat x p = modNat y p.
Lemma modNat_correct_if : forall x y z (p : posnat), x * p + y = z -> modNat z p = modNat y p.
Lemma modNat_mult : forall x (p : posnat), modNat (x * p) p = 0.
Lemma modNat_add_same_l : forall x y z p, modNat (x + y) p = modNat (x + z) p -> modNat y p = modNat z p.
Lemma modNat_add_same_r : forall x y z p, modNat (y + x) p = modNat (z + x) p -> modNat y p = modNat z p.
Lemma expnat_base_S : forall n k, ((expnat k n) + n * (expnat k (pred n)) <= expnat (S k) n)%nat.
Lemma expnat_base_S_same : forall n, n > 0 -> (2 * (expnat n n) <= expnat (S n) n)%nat.
Lemma sqrt_le_lin_gen : forall a b, (a <= b -> Nat.sqrt a <= b)%nat.
Lemma div2_le_mono : forall n1 n2, (n1 <= n2 -> div2 n1 <= div2 n2)%nat.
Lemma div2_ge : forall n n', n >= n' -> forall x, (n' = 2 * x)%nat -> div2 n >= x.