Section Log_pos. (* Log of positive integers *)
(** First we build [log_inf] and [log_sup] *)
Fixpoint log_inf (p:positive) : Z :=
match p with
| xH => 0 (* 1 *)
| xO q => Z.succ (log_inf q)       (* 2n *)
| xI q => Z.succ (log_inf q)       (* 2n+1 *)
end.
Fixpoint log_sup (p:positive) : Z :=
match p with
| xH => 0	(* 1 *)
| xO n => Z.succ (log_sup n) (* 2n *)
| xI n => Z.succ (Z.succ (log_inf n))	(* 2n+1 *)
end.
Hint Unfold log_inf log_sup : core.
(** Then we give the specifications of [log_inf] and [log_sup] and prove their validity *)
Hint Resolve Z.le_trans: zarith.

Theorem log_inf_correct :
forall x:positive,
0 <= log_inf x /\ two_p (log_inf x) <= Zpos x < two_p (Z.succ (log_inf x)).