(** Slice of an integer *)

Definition Zslice n k1 k2 :=
  if Zle_bool 0 k2 then Z.rem (Zscale n (-k1)) (Zpower beta k2) else Z0.

(* Specifications: *)
Theorem Zdigit_slice : forall n k1 k2 k, (0 <= k < k2)%Z -> Zdigit (Zslice n k1 k2) k = Zdigit n (k1 + k).
Theorem Zdigit_slice_out : forall n k1 k2 k, (k2 <= k)%Z -> Zdigit (Zslice n k1 k2) k = Z0.
Theorem Zslice_0 : forall k k', Zslice 0 k k' = Z0.
Theorem Zsame_sign_slice : forall n k k', (0 <= n * Zslice n k k')%Z.
Theorem Zslice_slice : forall n k1 k2 k1' k2', (0 <= k1' <= k2)%Z -> Zslice (Zslice n k1 k2) k1' k2' = Zslice n (k1 + k1') (Zmin (k2 - k1') k2').
Theorem Zslice_mul_pow : forall n k k1 k2, (0 <= k)%Z -> Zslice (n * Zpower beta k) k1 k2 = Zslice n (k1 - k) k2.
Theorem Zslice_div_pow : forall n k k1 k2, (0 <= k)%Z -> (0 <= k1)%Z -> Zslice (Z.quot n (Zpower beta k)) k1 k2 = Zslice n (k1 + k) k2.
Theorem Zslice_scale : forall n k k1 k2, (0 <= k1)%Z -> Zslice (Zscale n k) k1 k2 = Zslice n (k1 - k) k2.
Theorem Zslice_div_pow_scale : forall n k k1 k2, (0 <= k)%Z -> Zslice (Z.quot n (Zpower beta k)) k1 k2 = Zscale (Zslice n k (k1 + k2)) (-k1).
Theorem Zplus_slice : forall n k l1 l2, (0 <= l1)%Z -> (0 <= l2)%Z -> (Zslice n k l1 + Zscale (Zslice n (k + l1) l2) l1)%Z = Zslice n k (l1 + l2).
Theorem Zdigit_slice : forall n k1 k2 k, (0 <= k < k2)%Z -> Zdigit (Zslice n k1 k2) k = Zdigit n (k1 + k).
Theorem Zdigit_slice_out : forall n k1 k2 k, (k2 <= k)%Z -> Zdigit (Zslice n k1 k2) k = Z0.
Theorem Zslice_0 : forall k k', Zslice 0 k k' = Z0.
Theorem Zsame_sign_slice : forall n k k', (0 <= n * Zslice n k k')%Z.
Theorem Zslice_slice : forall n k1 k2 k1' k2', (0 <= k1' <= k2)%Z -> Zslice (Zslice n k1 k2) k1' k2' = Zslice n (k1 + k1') (Zmin (k2 - k1') k2').
Theorem Zslice_mul_pow : forall n k k1 k2, (0 <= k)%Z -> Zslice (n * Zpower beta k) k1 k2 = Zslice n (k1 - k) k2.
Theorem Zslice_div_pow : forall n k k1 k2, (0 <= k)%Z -> (0 <= k1)%Z -> Zslice (Z.quot n (Zpower beta k)) k1 k2 = Zslice n (k1 + k) k2.
Theorem Zslice_scale : forall n k k1 k2, (0 <= k1)%Z -> Zslice (Zscale n k) k1 k2 = Zslice n (k1 - k) k2.
Theorem Zslice_div_pow_scale : forall n k k1 k2, (0 <= k)%Z -> Zslice (Z.quot n (Zpower beta k)) k1 k2 = Zscale (Zslice n k (k1 + k2)) (-k1).
Theorem Zplus_slice : forall n k l1 l2, (0 <= l1)%Z -> (0 <= l2)%Z -> (Zslice n k l1 + Zscale (Zslice n (k + l1) l2) l1)%Z = Zslice n k (l1 + l2).