intuition.
specialize (Nat.log2_spec_alt); intuition.
destruct (H1 x).
eapply lt_le_trans.
2:{
eapply H.
}
eapply (expnat_2_ge_1 c).
intuition.
(* This case split probably isn't necessary *)
destruct (eq_nat_dec x0 0).
rewrite e in H3.
rewrite plus_0_r in *.
rewrite H3.
rewrite <- Nat.pow_mul_r.
eapply Nat.pow_lt_mono_r.
omega.
rewrite <- H3.
assert (c <= Nat.log2 x).
eapply (@Nat.pow_le_mono_r_iff 2).
omega.
rewrite <- H3.
trivial.
eapply le_lt_trans.
eapply mult_le_compat.
eapply le_refl.
eapply H4.
eapply log_square_lt.
eapply le_trans.
2:{
eapply H0.
}
eapply Nat.pow_le_mono_r.
omega.
omega.
destruct (eq_nat_dec c 0).
rewrite e.
simpl.
eapply le_lt_trans.
assert (1 <= expnat 2 0).
trivial.
eapply H4.
eapply Nat.pow_lt_mono_r.
omega.
omega.
assert (expnat x c < expnat (2 ^ S (Nat.log2 x)) c).
eapply Nat.pow_lt_mono_l.
omega.
eapply Nat.log2_spec.
omega.
eapply lt_le_trans.
eapply H4.
rewrite <- Nat.pow_mul_r.
eapply Nat.pow_le_mono_r.
omega.
assert (c <= S (Nat.log2 x)).
eapply (@Nat.pow_le_mono_r_iff 2).
omega.
eapply le_trans.
eapply H.
eapply lt_le_weak.
eapply Nat.log2_spec.
omega.
eapply le_trans.
eapply mult_le_compat.
eapply le_refl.
eapply H6.
eapply S_log_square_lt.
eapply le_trans.
2:{
eapply H0.
}
eapply Nat.pow_le_mono_r.
omega.
omega.
Qed.

(* Specifications: *)
Theorem poly_lt_exp :
forall c,
exists x,
forall y, y >= x ->
expnat y c < expnat 2 y.