(************************************************************************)
(*         *      The Rocq Prover / The Rocq Development Team           *)
(*  v      *         Copyright INRIA, CNRS and contributors             *)
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
(*   \VV/  **************************************************************)
(*    //   *    This file is distributed under the terms of the         *)
(*         *     GNU Lesser General Public License Version 2.1          *)
(*         *     (see LICENSE file for the text of the license)         *)
(************************************************************************)
Require Export Zpow_def.
Local Open Scope Z_scope.
(** * Power functions over [Z] *)
(** Nota : this file is mostly deprecated. The definition of [Z.pow] and its usual properties are now provided by module [BinInt.Z]. Powers of 2 are also available there (see [Z.shiftl] and [Z.shiftr]). Only remain here: - [Zpower_nat] : a power function with a [nat] exponent - old-style powers of two, such as [two_p] - [Zdiv_rest] : a division + modulo when the divisor is a power of 2 *)
(** [Zpower_nat z n] is the n-th power of [z] when [n] is an unary integer (type [nat]) and [z] a signed integer (type [Z]) *)
Definition Zpower_nat (z:Z) := nat_rect _ 1 (fun _ => Z.mul z).

(* Specifications: *)
Lemma Zpower_nat_0_r z : Zpower_nat z 0 = 1.
(** Conversions between powers of unary and binary integers *)
Lemma Zpower_pos_nat (z : Z) (p : positive) :
Z.pow_pos z p = Zpower_nat z (Pos.to_nat p).
Lemma Zpower_nat_Z (z : Z) (n : nat) :
Zpower_nat z n = z ^ (Z.of_nat n).
Theorem Zpower_nat_Zpower z n : 0 <= n ->
z^n = Zpower_nat z (Z.abs_nat n).